From d2bc02a1e14f8eb5a96943450fca9d03334c6d65 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 5 Feb 2025 18:52:51 +0100 Subject: [PATCH] Guard against NPE on arguments in `TypeAnnotationParameter` --- .../hibernate/TypeAnnotationParameter.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/openrewrite/hibernate/TypeAnnotationParameter.java b/src/main/java/org/openrewrite/hibernate/TypeAnnotationParameter.java index a037d22..210bda7 100644 --- a/src/main/java/org/openrewrite/hibernate/TypeAnnotationParameter.java +++ b/src/main/java/org/openrewrite/hibernate/TypeAnnotationParameter.java @@ -16,15 +16,13 @@ package org.openrewrite.hibernate; import org.jspecify.annotations.Nullable; -import org.openrewrite.ExecutionContext; -import org.openrewrite.Recipe; -import org.openrewrite.Tree; -import org.openrewrite.TreeVisitor; +import org.openrewrite.*; import org.openrewrite.internal.ListUtils; import org.openrewrite.java.AnnotationMatcher; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.JLeftPadded; import org.openrewrite.java.tree.JavaType; @@ -40,7 +38,8 @@ public class TypeAnnotationParameter extends Recipe { - private static final AnnotationMatcher FQN_TYPE_ANNOTATION = new AnnotationMatcher("@org.hibernate.annotations.Type"); + private static final String ORG_HIBERNATE_ANNOTATIONS_TYPE = "org.hibernate.annotations.Type"; + private static final AnnotationMatcher FQN_TYPE_ANNOTATION = new AnnotationMatcher("@" + ORG_HIBERNATE_ANNOTATIONS_TYPE); @Override public String getDisplayName() { @@ -65,7 +64,7 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return new JavaIsoVisitor() { + JavaIsoVisitor visitor = new JavaIsoVisitor() { @Override public J.@Nullable Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ctx) { J.Annotation a = super.visitAnnotation(annotation, ctx); @@ -74,19 +73,19 @@ public TreeVisitor getVisitor() { } // Remove entire annotation if type is one of the removed types - if (a.getArguments().stream().anyMatch(arg -> { + if (a.getArguments() != null && a.getArguments().stream().anyMatch(arg -> { if (arg instanceof J.Assignment) { J.Assignment assignment = (J.Assignment) arg; if (assignment.getVariable() instanceof J.Identifier && - "type".equals(((J.Identifier) assignment.getVariable()).getSimpleName()) && - assignment.getAssignment() instanceof J.Literal) { + "type".equals(((J.Identifier) assignment.getVariable()).getSimpleName()) && + assignment.getAssignment() instanceof J.Literal) { String fqTypeName = (String) ((J.Literal) assignment.getAssignment()).getValue(); return REMOVED_FQNS.contains(fqTypeName); } } return false; })) { - maybeRemoveImport("org.hibernate.annotations.Type"); + maybeRemoveImport(ORG_HIBERNATE_ANNOTATIONS_TYPE); return null; } @@ -96,7 +95,7 @@ public TreeVisitor getVisitor() { if (temporalType.get() != null) { maybeAddImport("jakarta.persistence.Temporal"); maybeAddImport("jakarta.persistence.TemporalType"); - maybeRemoveImport("org.hibernate.annotations.Type"); + maybeRemoveImport(ORG_HIBERNATE_ANNOTATIONS_TYPE); return JavaTemplate.builder("@Temporal(TemporalType." + temporalType.get().toUpperCase() + ")") .doBeforeParseTemplate(System.out::println) .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "jakarta.persistence-api")) @@ -116,8 +115,8 @@ private AtomicReference getTemporalTypeArgument(J.Annotation a) { public J.Assignment visitAssignment(J.Assignment assignment, AtomicReference ref) { J.Assignment as = super.visitAssignment(assignment, ref); if (J.Literal.isLiteralValue(as.getAssignment(), "date") || - J.Literal.isLiteralValue(as.getAssignment(), "time") || - J.Literal.isLiteralValue(as.getAssignment(), "timestamp")) { + J.Literal.isLiteralValue(as.getAssignment(), "time") || + J.Literal.isLiteralValue(as.getAssignment(), "timestamp")) { //noinspection DataFlowIssue ref.set((String) ((J.Literal) as.getAssignment()).getValue()); } @@ -128,14 +127,14 @@ public J.Assignment visitAssignment(J.Assignment assignment, AtomicReference { if (arg instanceof J.Assignment) { J.Assignment assignment = (J.Assignment) arg; if (assignment.getVariable() instanceof J.Identifier && - "type".equals(((J.Identifier) assignment.getVariable()).getSimpleName()) && - assignment.getAssignment() instanceof J.Literal) { + "type".equals(((J.Identifier) assignment.getVariable()).getSimpleName()) && + assignment.getAssignment() instanceof J.Literal) { String fqTypeName = (String) ((J.Literal) assignment.getAssignment()).getValue(); J.Identifier identifier = new J.Identifier( Tree.randomId(), @@ -164,6 +163,7 @@ private J.Annotation replaceArgumentWithClass(J.Annotation a) { })); } }; + return Preconditions.check(new UsesType<>(ORG_HIBERNATE_ANNOTATIONS_TYPE, false), visitor); } private static String getSimpleName(String fqName) {