@@ -60,6 +60,16 @@ public void foo() {}
60
60
}
61
61
""" ;
62
62
63
+ @ Language ("java" )
64
+ private static final String jakartaAnnotation =
65
+ """
66
+ package jakarta.annotation;
67
+ public @interface Nonnull {
68
+ }
69
+ public @interface Nullable {
70
+ }
71
+ """ ;
72
+
63
73
@ Override
64
74
public void defaults (RecipeSpec spec ) {
65
75
spec .recipe (
@@ -574,6 +584,170 @@ public class TestApplication {
574
584
);
575
585
}
576
586
587
+ @ Test
588
+ void projectWithSpringBoot3StarterWebShouldNotRemoveJakartaDependencyWhenUsingNonnullAnnotation () {
589
+ rewriteRun (
590
+ spec -> spec .parser (JavaParser .fromJavaVersion ().dependsOn (javaxServlet , jakartaAnnotation )),
591
+ mavenProject (
592
+ "Sample" ,
593
+ //language=xml
594
+ pomXml (
595
+ """
596
+ <?xml version="1.0" encoding="UTF-8"?>
597
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
598
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
599
+ <modelVersion>4.0.0</modelVersion>
600
+ <parent>
601
+ <groupId>org.springframework.boot</groupId>
602
+ <artifactId>spring-boot-starter-parent</artifactId>
603
+ <version>3.2.5</version>
604
+ <relativePath/> <!-- lookup parent from repository -->
605
+ </parent>
606
+ <groupId>com.example</groupId>
607
+ <artifactId>demo</artifactId>
608
+ <version>0.0.1-SNAPSHOT</version>
609
+ <dependencies>
610
+ <dependency>
611
+ <groupId>jakarta.annotation</groupId>
612
+ <artifactId>jakarta.annotation-api</artifactId>
613
+ <version>1.3.5</version>
614
+ </dependency>
615
+ <dependency>
616
+ <groupId>org.springframework.boot</groupId>
617
+ <artifactId>spring-boot-starter-web</artifactId>
618
+ </dependency>
619
+ </dependencies>
620
+ </project>
621
+ """ ,
622
+ """
623
+ <?xml version="1.0" encoding="UTF-8"?>
624
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
625
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
626
+ <modelVersion>4.0.0</modelVersion>
627
+ <parent>
628
+ <groupId>org.springframework.boot</groupId>
629
+ <artifactId>spring-boot-starter-parent</artifactId>
630
+ <version>3.2.5</version>
631
+ <relativePath/> <!-- lookup parent from repository -->
632
+ </parent>
633
+ <groupId>com.example</groupId>
634
+ <artifactId>demo</artifactId>
635
+ <version>0.0.1-SNAPSHOT</version>
636
+ <dependencies>
637
+ <dependency>
638
+ <groupId>jakarta.annotation</groupId>
639
+ <artifactId>jakarta.annotation-api</artifactId>
640
+ <version>2.0.0</version>
641
+ </dependency>
642
+ <dependency>
643
+ <groupId>org.springframework.boot</groupId>
644
+ <artifactId>spring-boot-starter-web</artifactId>
645
+ </dependency>
646
+ </dependencies>
647
+ </project>
648
+ """
649
+ ),
650
+ srcMainJava (
651
+ //language=java
652
+ java (
653
+ """
654
+ import jakarta.annotation.Nonnull;
655
+
656
+ public class TestApplication {
657
+ @Nonnull
658
+ public String upperCase(@Nonnull String input) {
659
+ return input.toUpperCase();
660
+ }
661
+ }
662
+ """
663
+ )
664
+ )
665
+ )
666
+ );
667
+ }
668
+
669
+ @ Test
670
+ void projectWithSpringBoot3StarterWebShouldNotRemoveJakartaDependencyWhenUsingNullableAnnotation () {
671
+ rewriteRun (
672
+ spec -> spec .parser (JavaParser .fromJavaVersion ().dependsOn (javaxServlet , jakartaAnnotation )),
673
+ mavenProject (
674
+ "Sample" ,
675
+ //language=xml
676
+ pomXml (
677
+ """
678
+ <?xml version="1.0" encoding="UTF-8"?>
679
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
680
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
681
+ <modelVersion>4.0.0</modelVersion>
682
+ <parent>
683
+ <groupId>org.springframework.boot</groupId>
684
+ <artifactId>spring-boot-starter-parent</artifactId>
685
+ <version>3.2.5</version>
686
+ <relativePath/> <!-- lookup parent from repository -->
687
+ </parent>
688
+ <groupId>com.example</groupId>
689
+ <artifactId>demo</artifactId>
690
+ <version>0.0.1-SNAPSHOT</version>
691
+ <dependencies>
692
+ <dependency>
693
+ <groupId>jakarta.annotation</groupId>
694
+ <artifactId>jakarta.annotation-api</artifactId>
695
+ <version>1.3.5</version>
696
+ </dependency>
697
+ <dependency>
698
+ <groupId>org.springframework.boot</groupId>
699
+ <artifactId>spring-boot-starter-web</artifactId>
700
+ </dependency>
701
+ </dependencies>
702
+ </project>
703
+ """ ,
704
+ """
705
+ <?xml version="1.0" encoding="UTF-8"?>
706
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
707
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
708
+ <modelVersion>4.0.0</modelVersion>
709
+ <parent>
710
+ <groupId>org.springframework.boot</groupId>
711
+ <artifactId>spring-boot-starter-parent</artifactId>
712
+ <version>3.2.5</version>
713
+ <relativePath/> <!-- lookup parent from repository -->
714
+ </parent>
715
+ <groupId>com.example</groupId>
716
+ <artifactId>demo</artifactId>
717
+ <version>0.0.1-SNAPSHOT</version>
718
+ <dependencies>
719
+ <dependency>
720
+ <groupId>jakarta.annotation</groupId>
721
+ <artifactId>jakarta.annotation-api</artifactId>
722
+ <version>2.0.0</version>
723
+ </dependency>
724
+ <dependency>
725
+ <groupId>org.springframework.boot</groupId>
726
+ <artifactId>spring-boot-starter-web</artifactId>
727
+ </dependency>
728
+ </dependencies>
729
+ </project>
730
+ """
731
+ ),
732
+ srcMainJava (
733
+ //language=java
734
+ java (
735
+ """
736
+ import jakarta.annotation.Nullable;
737
+
738
+ public class TestApplication {
739
+ @Nullable
740
+ public String safeUpperCase(@Nullable String input) {
741
+ return input == null ? null : input.toUpperCase();
742
+ }
743
+ }
744
+ """
745
+ )
746
+ )
747
+ )
748
+ );
749
+ }
750
+
577
751
@ Test
578
752
void upgradeAnnotationApiFromV1ToV2 () {
579
753
rewriteRun (
0 commit comments