Skip to content

Commit 067a2e8

Browse files
cigalygavinking
authored andcommitted
HHH-19091 Changed Hibernate Processor code to allow meta model generation from inner interafce
1 parent 377f929 commit 067a2e8

File tree

6 files changed

+56
-17
lines changed

6 files changed

+56
-17
lines changed

tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,10 @@ private static String getGeneratedClassName(Metamodel entity) {
257257
}
258258

259259
private static String getGeneratedSuperclassName(Element superClassElement, boolean jakartaDataStyle) {
260-
final TypeElement typeElement = (TypeElement) superClassElement;
260+
return getGeneratedClassName( (TypeElement) superClassElement, jakartaDataStyle );
261+
}
262+
263+
private static String getGeneratedClassName(TypeElement typeElement, boolean jakartaDataStyle) {
261264
final String simpleName = typeElement.getSimpleName().toString();
262265
final Element enclosingElement = typeElement.getEnclosingElement();
263266
return (enclosingElement instanceof TypeElement

tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
import static org.hibernate.processor.util.TypeUtils.getAnnotationMirror;
8787
import static org.hibernate.processor.util.TypeUtils.getAnnotationValue;
8888
import static org.hibernate.processor.util.TypeUtils.hasAnnotation;
89-
import static org.hibernate.processor.util.TypeUtils.isClassOrRecordType;
89+
import static org.hibernate.processor.util.TypeUtils.isClassRecordOrInterfaceType;
9090
import static org.hibernate.processor.util.TypeUtils.isMemberType;
9191

9292
/**
@@ -369,7 +369,8 @@ private void processClasses(RoundEnvironment roundEnvironment) {
369369
final TypeElement typeElement = context.getElementUtils().getTypeElement( elementName );
370370
try {
371371
final AnnotationMetaEntity metaEntity =
372-
AnnotationMetaEntity.create( typeElement, context );
372+
AnnotationMetaEntity.create( typeElement, context,
373+
parentMetadata( typeElement, context::getMetaEntity ) );
373374
context.addMetaAuxiliary( metaEntity.getQualifiedName(), metaEntity );
374375
context.removeElementToRedo( elementName );
375376
}
@@ -410,7 +411,8 @@ else if ( element instanceof TypeElement typeElement ) {
410411
|| provider.getValue().toString().equalsIgnoreCase("hibernate") ) {
411412
context.logMessage( Diagnostic.Kind.OTHER, "Processing repository class '" + element + "'" );
412413
final AnnotationMetaEntity metaEntity =
413-
AnnotationMetaEntity.create( typeElement, context );
414+
AnnotationMetaEntity.create( typeElement, context,
415+
parentMetadata( parent, context::getMetaEntity ) );
414416
if ( metaEntity.isInitialized() ) {
415417
context.addMetaAuxiliary( metaEntity.getQualifiedName(), metaEntity );
416418
}
@@ -422,7 +424,8 @@ else if ( element instanceof TypeElement typeElement ) {
422424
if ( hasAnnotation( member, HQL, SQL, FIND ) ) {
423425
context.logMessage( Diagnostic.Kind.OTHER, "Processing annotated class '" + element + "'" );
424426
final AnnotationMetaEntity metaEntity =
425-
AnnotationMetaEntity.create( typeElement, context );
427+
AnnotationMetaEntity.create( typeElement, context,
428+
parentMetadata( parent, context::getMetaEntity ) );
426429
context.addMetaAuxiliary( metaEntity.getQualifiedName(), metaEntity );
427430
break;
428431
}
@@ -442,9 +445,9 @@ else if ( element instanceof TypeElement typeElement ) {
442445
}
443446
}
444447
}
445-
if ( isClassOrRecordType( element ) ) {
448+
if ( isClassRecordOrInterfaceType( element ) ) {
446449
for ( final Element child : element.getEnclosedElements() ) {
447-
if ( isClassOrRecordType( child ) ) {
450+
if ( isClassRecordOrInterfaceType( child ) ) {
448451
processElement( child, element );
449452
}
450453
}
@@ -481,7 +484,8 @@ private boolean hasPackageAnnotation(Element element, String annotation) {
481484
private void createMetaModelClasses() {
482485

483486
for ( Metamodel aux : context.getMetaAuxiliaries() ) {
484-
if ( !context.isAlreadyGenerated(aux) ) {
487+
if ( !context.isAlreadyGenerated(aux)
488+
&& !isClassRecordOrInterfaceType( aux.getElement().getEnclosingElement() ) ) {
485489
context.logMessage( Diagnostic.Kind.OTHER,
486490
"Writing metamodel for auxiliary '" + aux + "'" );
487491
ClassWriter.writeFile( aux, context );
@@ -623,7 +627,7 @@ private boolean hasAuxiliaryAnnotations(Element element) {
623627
}
624628

625629
private void handleRootElementAnnotationMirrors(final Element element, @Nullable Element parent) {
626-
if ( isClassOrRecordType( element ) ) {
630+
if ( isClassRecordOrInterfaceType( element ) ) {
627631
if ( isEntityOrEmbeddable( element ) ) {
628632
final TypeElement typeElement = (TypeElement) element;
629633
indexEntityName( typeElement );
@@ -741,7 +745,8 @@ private void indexEnumValues(TypeMirror type) {
741745
private void handleRootElementAuxiliaryAnnotationMirrors(final Element element) {
742746
if ( element instanceof TypeElement ) {
743747
final AnnotationMetaEntity metaEntity =
744-
AnnotationMetaEntity.create( (TypeElement) element, context );
748+
AnnotationMetaEntity.create( (TypeElement) element, context,
749+
parentMetadata( element.getEnclosingElement(), context::getMetaEntity ) );
745750
context.addMetaAuxiliary( metaEntity.getQualifiedName(), metaEntity );
746751
}
747752
else if ( element instanceof PackageElement ) {

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
import org.checkerframework.checker.nullness.qual.Nullable;
88

99
import javax.lang.model.element.ExecutableElement;
10+
import javax.lang.model.element.TypeElement;
1011
import java.util.List;
1112
import java.util.StringTokenizer;
1213

14+
import static org.hibernate.processor.util.TypeUtils.getGeneratedClassFullyQualifiedName;
1315
import static org.hibernate.processor.util.TypeUtils.isPrimitive;
1416

1517
/**
@@ -185,11 +187,13 @@ private void condition(StringBuilder declaration, int i, String paramName, Strin
185187
private void path(StringBuilder declaration, String paramName) {
186188
final StringTokenizer tokens = new StringTokenizer(paramName, ".");
187189
String typeName = entity;
188-
while ( typeName!= null && tokens.hasMoreTokens() ) {
190+
while ( typeName != null && tokens.hasMoreTokens() ) {
191+
final TypeElement typeElement = annotationMetaEntity.getContext().getElementUtils()
192+
.getTypeElement( typeName );
189193
final String memberName = tokens.nextToken();
190194
declaration
191195
.append(".get(")
192-
.append(annotationMetaEntity.importType(typeName + '_'))
196+
.append( annotationMetaEntity.importType( getGeneratedClassFullyQualifiedName( typeElement, false ) ) )
193197
.append('.')
194198
.append(memberName)
195199
.append(')');

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.hibernate.AssertionFailure;
99

1010
import javax.lang.model.element.ExecutableElement;
11+
import javax.lang.model.element.TypeElement;
1112
import java.util.List;
1213
import java.util.Set;
1314

@@ -36,6 +37,7 @@
3637
import static org.hibernate.processor.util.Constants.SESSION_TYPES;
3738
import static org.hibernate.processor.util.Constants.STREAM;
3839
import static org.hibernate.processor.util.Constants.TYPED_QUERY;
40+
import static org.hibernate.processor.util.TypeUtils.getGeneratedClassFullyQualifiedName;
3941
import static org.hibernate.processor.util.TypeUtils.isPrimitive;
4042

4143
/**
@@ -310,12 +312,15 @@ void handleRestrictionParameters(
310312
.append( ")\n" );
311313
}
312314
}
313-
else if ( isRangeParam(paramType) ) {
315+
else if ( isRangeParam(paramType) && returnTypeName!= null ) {
316+
final TypeElement entityElement = annotationMetaEntity.getContext().getElementUtils()
317+
.getTypeElement( returnTypeName );
314318
declaration
315319
.append("\t\t\t.addRestriction(")
316320
.append(annotationMetaEntity.importType(HIB_RESTRICTION))
317321
.append(".restrict(")
318-
.append(annotationMetaEntity.importType(returnTypeName + '_'))
322+
.append(annotationMetaEntity.importType(
323+
getGeneratedClassFullyQualifiedName( entityElement, false ) ))
319324
.append('.')
320325
.append(paramName)
321326
.append(", ")

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,8 @@ public AnnotationMetaEntity(
184184
jakartaDataStaticModel ) );
185185
}
186186

187-
public static AnnotationMetaEntity create(TypeElement element, Context context) {
188-
return create( element,context, false, false, false, null );
187+
public static AnnotationMetaEntity create(TypeElement element, Context context, @Nullable AnnotationMetaEntity parent) {
188+
return create( element,context, false, false, false, parent );
189189
}
190190

191191
public static AnnotationMetaEntity create(

tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import javax.lang.model.element.ElementKind;
1818
import javax.lang.model.element.ExecutableElement;
1919
import javax.lang.model.element.Name;
20+
import javax.lang.model.element.PackageElement;
2021
import javax.lang.model.element.TypeElement;
2122
import javax.lang.model.element.VariableElement;
2223
import javax.lang.model.type.ArrayType;
@@ -512,6 +513,14 @@ public static boolean isClassOrRecordType(Element element) {
512513
return kind.isClass() && kind != ElementKind.ENUM;
513514
}
514515

516+
public static boolean isClassRecordOrInterfaceType(Element element) {
517+
final ElementKind kind = element.getKind();
518+
// we want to accept classes and records but not enums,
519+
// and we want to avoid depending on ElementKind.RECORD
520+
return kind.isClass() && kind != ElementKind.ENUM
521+
|| kind.isInterface() && kind != ElementKind.ANNOTATION_TYPE;
522+
}
523+
515524
public static boolean primitiveClassMatchesKind(Class<?> itemType, TypeKind kind) {
516525
return switch ( kind ) {
517526
case SHORT -> itemType.equals( Short.class );
@@ -666,10 +675,23 @@ public static boolean isMemberType(Element element) {
666675
return element.getEnclosingElement() instanceof TypeElement;
667676
}
668677

678+
public static String getGeneratedClassFullyQualifiedName(TypeElement typeElement, boolean jakartaDataStyle) {
679+
final String simpleName = typeElement.getSimpleName().toString();
680+
final Element enclosingElement = typeElement.getEnclosingElement();
681+
return (enclosingElement instanceof TypeElement
682+
? getGeneratedClassFullyQualifiedName( (TypeElement) enclosingElement, jakartaDataStyle )
683+
: ((PackageElement) enclosingElement).getQualifiedName().toString())
684+
+ "." + (jakartaDataStyle ? '_' + simpleName : simpleName + '_');
685+
}
686+
687+
669688
public static String getGeneratedClassFullyQualifiedName(TypeElement element, String packageName, boolean jakartaDataStyle) {
670-
final StringBuilder builder = new StringBuilder( packageName.isEmpty() ? "" : packageName + "." );
689+
final StringBuilder builder = new StringBuilder( packageName );
671690
for ( String s : split( ".", element.getQualifiedName().toString().substring( builder.length() ) ) ) {
672691
final String part = removeDollar( s );
692+
if ( !builder.isEmpty() ) {
693+
builder.append( "." );
694+
}
673695
builder.append( jakartaDataStyle ? '_' + part : part + '_' );
674696
}
675697
return builder.toString();

0 commit comments

Comments
 (0)