Skip to content

Commit

Permalink
fix HHH-19106 deconstruct inherited annotations before printing them
Browse files Browse the repository at this point in the history
  • Loading branch information
gavinking committed Feb 6, 2025
1 parent ecc2151 commit 225d9b3
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@

import java.util.List;

import static jakarta.transaction.Transactional.TxType.REQUIRES_NEW;

@Repository
public interface Bookshop extends CrudRepository<Book,String> {
@Find
@Transactional
@Transactional(REQUIRES_NEW)
List<Book> byPublisher(@Size(min=2,max=100) String publisher_name);

@Find
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,14 @@
import org.hibernate.processor.model.Metamodel;

import javax.annotation.processing.FilerException;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.tools.Diagnostic;
import javax.tools.FileObject;
import java.io.IOException;
Expand Down Expand Up @@ -102,7 +105,11 @@ private static StringBuffer generateBody(Metamodel entity, Context context) {
if ( context.addSuppressWarningsAnnotation() ) {
pw.println( writeSuppressWarnings(context) );
}
entity.inheritedAnnotations().forEach(pw::println);
entity.inheritedAnnotations()
.forEach( annotation -> {
printAnnotation( annotation, pw );
pw.print('\n');
} );

printClassDeclaration( entity, pw );

Expand Down Expand Up @@ -134,9 +141,10 @@ private static StringBuffer generateBody(Metamodel entity, Context context) {
pw.println('\t' + line);
if ( line.trim().startsWith("@Override") ) {
metaMember.inheritedAnnotations()
.forEach(x -> {
.forEach(annotation -> {
pw.print('\t');
pw.println(x);
printAnnotation( annotation, pw );
pw.print('\n');
});
}
});
Expand All @@ -149,6 +157,60 @@ private static StringBuffer generateBody(Metamodel entity, Context context) {
}
}

private static void printAnnotation(AnnotationMirror annotation, PrintWriter pw) {
pw.print('@');
final TypeElement type = (TypeElement) annotation.getAnnotationType().asElement();
pw.print( type.getQualifiedName().toString() );
var elementValues = annotation.getElementValues();
if (!elementValues.isEmpty()) {
pw.print('(');
boolean first = true;
for (var entry : elementValues.entrySet()) {
if (first) {
first = false;
}
else {
pw.print(',');
}
pw.print( entry.getKey().getSimpleName() );
pw.print( '=' );
printAnnotationValue( pw, entry.getValue() );
}
pw.print(')');
}
}

private static void printAnnotationValue(PrintWriter pw, AnnotationValue value) {
final Object argument = value.getValue();
if (argument instanceof VariableElement variable) {
pw.print( variable.getEnclosingElement() );
pw.print('.');
pw.print( variable.getSimpleName().toString() );
}
else if (argument instanceof AnnotationMirror childAnnotation) {
printAnnotation( childAnnotation, pw );
}
else if (argument instanceof List) {
final List<? extends AnnotationValue> list =
(List<? extends AnnotationValue>) argument;
pw.print('{');
boolean first = true;
for (AnnotationValue listedValue : list) {
if (first) {
first = false;
}
else {
pw.print(',');
}
printAnnotationValue( pw, listedValue );
}
pw.print('}');
}
else {
pw.print( argument );
}
}

private static void printClassDeclaration(Metamodel entity, PrintWriter pw) {
if ( isMemberType( entity.getElement() ) ) {
final Set<Modifier> modifiers = entity.getElement().getModifiers();
Expand Down

0 comments on commit 225d9b3

Please sign in to comment.