Skip to content

Commit 9f8ac34

Browse files
committed
Remove @NullUnmarked
Closes gh-18491
1 parent 3f66d8b commit 9f8ac34

12 files changed

Lines changed: 85 additions & 90 deletions

File tree

cas/src/main/java/org/springframework/security/cas/authentication/CasAuthenticationProvider.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.apereo.cas.client.validation.Assertion;
2525
import org.apereo.cas.client.validation.TicketValidationException;
2626
import org.apereo.cas.client.validation.TicketValidator;
27-
import org.jspecify.annotations.NullUnmarked;
2827
import org.jspecify.annotations.Nullable;
2928

3029
import org.springframework.beans.factory.InitializingBean;
@@ -166,7 +165,6 @@ private CasAuthenticationToken authenticateNow(final Authentication authenticati
166165
* @param authentication
167166
* @return
168167
*/
169-
@NullUnmarked
170168
private @Nullable String getServiceUrl(Authentication authentication) {
171169
String serviceUrl;
172170
if (authentication.getDetails() instanceof ServiceAuthenticationDetails) {

core/src/main/java/org/springframework/security/access/expression/method/MethodSecurityEvaluationContext.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.lang.reflect.Method;
2020

2121
import org.aopalliance.intercept.MethodInvocation;
22-
import org.jspecify.annotations.NullUnmarked;
22+
import org.jspecify.annotations.Nullable;
2323

2424
import org.springframework.aop.framework.AopProxyUtils;
2525
import org.springframework.aop.support.AopUtils;
@@ -45,13 +45,11 @@ class MethodSecurityEvaluationContext extends MethodBasedEvaluationContext {
4545
* for each instance. Use the constructor which takes the resolver, as an argument
4646
* thus allowing for caching.
4747
*/
48-
MethodSecurityEvaluationContext(Authentication user, MethodInvocation mi) {
48+
MethodSecurityEvaluationContext(@Nullable Authentication user, MethodInvocation mi) {
4949
this(user, mi, new DefaultSecurityParameterNameDiscoverer());
5050
}
5151

52-
@NullUnmarked // FIXME: rootObject in MethodBasedEvaluationContext is non-null
53-
// (probably needs changed) but StandardEvaluationContext is Nullable
54-
MethodSecurityEvaluationContext(Authentication user, MethodInvocation mi,
52+
MethodSecurityEvaluationContext(@Nullable Authentication user, MethodInvocation mi,
5553
ParameterNameDiscoverer parameterNameDiscoverer) {
5654
super(mi.getThis(), getSpecificMethod(mi), mi.getArguments(), parameterNameDiscoverer);
5755
}

messaging/src/main/java/org/springframework/security/messaging/handler/invocation/reactive/AuthenticationPrincipalArgumentResolver.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import java.lang.annotation.Annotation;
2020

21-
import org.jspecify.annotations.NullUnmarked;
2221
import org.jspecify.annotations.Nullable;
2322
import org.reactivestreams.Publisher;
2423
import reactor.core.publisher.Mono;
@@ -152,9 +151,11 @@ public Mono<Object> resolveArgument(MethodParameter parameter, Message<?> messag
152151
// @formatter:on
153152
}
154153

155-
@NullUnmarked
156154
private @Nullable Object resolvePrincipal(MethodParameter parameter, @Nullable Object principal) {
157155
AuthenticationPrincipal authPrincipal = findMethodAnnotation(parameter);
156+
if (authPrincipal == null) {
157+
return null;
158+
}
158159
String expressionToParse = authPrincipal.expression();
159160
if (StringUtils.hasLength(expressionToParse)) {
160161
StandardEvaluationContext context = new StandardEvaluationContext();

taglibs/src/main/java/org/springframework/security/taglibs/authz/AbstractAuthorizeTag.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import jakarta.servlet.ServletRequest;
2525
import jakarta.servlet.ServletResponse;
2626
import jakarta.servlet.http.HttpServletRequest;
27-
import org.jspecify.annotations.NullUnmarked;
2827
import org.jspecify.annotations.Nullable;
2928

3029
import org.springframework.context.ApplicationContext;
@@ -180,7 +179,6 @@ public void setUrl(String url) {
180179
return this.method;
181180
}
182181

183-
@NullUnmarked
184182
public void setMethod(String method) {
185183
this.method = (method != null) ? method.toUpperCase(Locale.ENGLISH) : null;
186184
}

test/src/main/java/org/springframework/security/test/context/support/WithSecurityContextTestExecutionListener.java

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@
2020
import java.lang.reflect.AnnotatedElement;
2121
import java.util.function.Supplier;
2222

23-
import org.jspecify.annotations.NullUnmarked;
2423
import org.jspecify.annotations.Nullable;
2524

2625
import org.springframework.beans.BeanUtils;
2726
import org.springframework.context.ApplicationContext;
2827
import org.springframework.core.GenericTypeResolver;
2928
import org.springframework.core.annotation.AnnotatedElementUtils;
3029
import org.springframework.core.annotation.AnnotationUtils;
30+
import org.springframework.core.annotation.MergedAnnotation;
31+
import org.springframework.core.annotation.MergedAnnotations;
3132
import org.springframework.core.convert.converter.Converter;
3233
import org.springframework.security.core.context.SecurityContext;
3334
import org.springframework.security.core.context.SecurityContextHolder;
@@ -40,6 +41,7 @@
4041
import org.springframework.test.context.TestExecutionListener;
4142
import org.springframework.test.context.support.AbstractTestExecutionListener;
4243
import org.springframework.test.web.servlet.MockMvc;
44+
import org.springframework.util.Assert;
4345

4446
/**
4547
* A {@link TestExecutionListener} that will find annotations that are annotated with
@@ -79,7 +81,6 @@ public class WithSecurityContextTestExecutionListener extends AbstractTestExecut
7981
* {@link WithSecurityContext} on it. If that is not found, the class is inspected. If
8082
* still not found, then no {@link SecurityContext} is populated.
8183
*/
82-
@NullUnmarked
8384
@Override
8485
public void beforeTestMethod(TestContext testContext) {
8586
TestSecurityContext testSecurityContext = createTestSecurityContext(testContext.getTestMethod(), testContext);
@@ -102,7 +103,6 @@ public void beforeTestMethod(TestContext testContext) {
102103
* If configured before test execution sets the SecurityContext
103104
* @since 5.1
104105
*/
105-
@NullUnmarked
106106
@Override
107107
public void beforeTestExecution(TestContext testContext) {
108108
Supplier<SecurityContext> supplier = (Supplier<SecurityContext>) testContext
@@ -129,7 +129,6 @@ public void beforeTestExecution(TestContext testContext) {
129129
return createTestSecurityContext(rootDeclaringClass, withSecurityContext, context);
130130
}
131131

132-
@NullUnmarked
133132
@SuppressWarnings({ "rawtypes", "unchecked" })
134133
private @Nullable TestSecurityContext createTestSecurityContext(AnnotatedElement annotated,
135134
@Nullable WithSecurityContext withSecurityContext, TestContext context) {
@@ -140,7 +139,9 @@ public void beforeTestExecution(TestContext testContext) {
140139
WithSecurityContextFactory factory = createFactory(withSecurityContext, context);
141140
Class<? extends Annotation> type = (Class<? extends Annotation>) GenericTypeResolver
142141
.resolveTypeArgument(factory.getClass(), WithSecurityContextFactory.class);
142+
Assert.isTrue(type != null, factory.getClass() + " must specify a Type argument");
143143
Annotation annotation = findAnnotation(annotated, type);
144+
Assert.isTrue(annotation != null, "No annotation found for " + type + " on " + annotated);
144145
Supplier<SecurityContext> supplier = () -> {
145146
try {
146147
return factory.createSecurityContext(annotation);
@@ -153,22 +154,23 @@ public void beforeTestExecution(TestContext testContext) {
153154
return new TestSecurityContext(supplier, initialize);
154155
}
155156

156-
@NullUnmarked
157-
private @Nullable Annotation findAnnotation(AnnotatedElement annotated,
158-
@Nullable Class<? extends Annotation> type) {
157+
private @Nullable Annotation findAnnotation(AnnotatedElement annotated, Class<? extends Annotation> type) {
159158
Annotation findAnnotation = AnnotatedElementUtils.findMergedAnnotation(annotated, type);
160159
if (findAnnotation != null) {
161160
return findAnnotation;
162161
}
163-
Annotation[] allAnnotations = AnnotationUtils.getAnnotations(annotated);
164-
for (Annotation annotationToTest : allAnnotations) {
165-
WithSecurityContext withSecurityContext = AnnotationUtils.findAnnotation(annotationToTest.annotationType(),
166-
WithSecurityContext.class);
167-
if (withSecurityContext != null) {
168-
return annotationToTest;
169-
}
170-
}
171-
return null;
162+
MergedAnnotations allAnnotations = MergedAnnotations.from(annotated);
163+
// @formatter:off
164+
return allAnnotations.stream()
165+
.filter((annotationToTest) -> {
166+
WithSecurityContext withSecurityContext = AnnotationUtils.findAnnotation(annotationToTest.getType(),
167+
WithSecurityContext.class);
168+
return withSecurityContext != null;
169+
})
170+
.map(MergedAnnotation::synthesize)
171+
.findFirst()
172+
.orElse(null);
173+
// @formatter:on
172174
}
173175

174176
private WithSecurityContextFactory<? extends Annotation> createFactory(WithSecurityContext withSecurityContext,
@@ -189,7 +191,6 @@ private WithSecurityContextFactory<? extends Annotation> createFactory(WithSecur
189191
* Clears out the {@link TestSecurityContextHolder} and the
190192
* {@link SecurityContextHolder} after each test method.
191193
*/
192-
@NullUnmarked
193194
@Override
194195
public void afterTestMethod(TestContext testContext) {
195196
this.securityContextHolderStrategyConverter.convert(testContext).clearContext();

0 commit comments

Comments
 (0)