Skip to content

Commit 12697ff

Browse files
committed
Detect repositories nested in entities, for Panache2
1 parent c3e659d commit 12697ff

File tree

1 file changed

+81
-66
lines changed

1 file changed

+81
-66
lines changed

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

Lines changed: 81 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -398,72 +398,7 @@ private void processClasses(RoundEnvironment roundEnvironment) {
398398

399399
private void processElement(Element element, @Nullable Element parent) {
400400
try {
401-
if ( !included( element )
402-
|| hasAnnotation( element, Constants.EXCLUDE )
403-
|| hasPackageAnnotation( element, Constants.EXCLUDE )
404-
|| element.getModifiers().contains( Modifier.PRIVATE ) ) {
405-
// skip it completely
406-
return;
407-
}
408-
else if ( isEntityOrEmbeddable( element )
409-
&& !element.getModifiers().contains( Modifier.PRIVATE ) ) {
410-
context.logMessage( Diagnostic.Kind.OTHER, "Processing annotated entity class '" + element + "'" );
411-
handleRootElementAnnotationMirrors( element, parent );
412-
}
413-
else if ( hasAuxiliaryAnnotations( element ) ) {
414-
context.logMessage( Diagnostic.Kind.OTHER, "Processing annotated class '" + element + "'" );
415-
handleRootElementAuxiliaryAnnotationMirrors( element );
416-
}
417-
else if ( element instanceof TypeElement typeElement ) {
418-
final AnnotationMirror repository = getAnnotationMirror( element, JD_REPOSITORY );
419-
if ( repository != null ) {
420-
final AnnotationValue provider = getAnnotationValue( repository, "provider" );
421-
if ( provider == null
422-
|| provider.getValue().toString().isEmpty()
423-
|| provider.getValue().toString().equalsIgnoreCase("hibernate") ) {
424-
context.logMessage( Diagnostic.Kind.OTHER, "Processing repository class '" + element + "'" );
425-
final AnnotationMetaEntity metaEntity =
426-
AnnotationMetaEntity.create( typeElement, context,
427-
parentMetadata( parent, context::getMetaEntity ) );
428-
if ( metaEntity.isInitialized() ) {
429-
context.addMetaAuxiliary( metaEntity.getQualifiedName(), metaEntity );
430-
}
431-
// otherwise discard it (assume it has query by magical method name stuff)
432-
}
433-
}
434-
else {
435-
for ( Element member : typeElement.getEnclosedElements() ) {
436-
if ( hasAnnotation( member, HQL, SQL, FIND ) ) {
437-
context.logMessage( Diagnostic.Kind.OTHER, "Processing annotated class '" + element + "'" );
438-
final AnnotationMetaEntity metaEntity =
439-
AnnotationMetaEntity.create( typeElement, context,
440-
parentMetadata( parent, context::getMetaEntity ) );
441-
context.addMetaAuxiliary( metaEntity.getQualifiedName(), metaEntity );
442-
break;
443-
}
444-
}
445-
if ( enclosesEntityOrEmbeddable( element ) ) {
446-
final NonManagedMetamodel metaEntity =
447-
NonManagedMetamodel.create( typeElement, context, false,
448-
parentMetadata( parent, context::getMetamodel ) );
449-
context.addMetaEntity( metaEntity.getQualifiedName(), metaEntity );
450-
if ( context.generateJakartaDataStaticMetamodel() ) {
451-
final NonManagedMetamodel dataMetaEntity =
452-
NonManagedMetamodel.create( typeElement, context, true,
453-
parentMetadata( parent, context::getDataMetaEntity ) );
454-
context.addDataMetaEntity( dataMetaEntity.getQualifiedName(), dataMetaEntity );
455-
}
456-
457-
}
458-
}
459-
}
460-
if ( isClassRecordOrInterfaceType( element ) ) {
461-
for ( final Element child : element.getEnclosedElements() ) {
462-
if ( isClassRecordOrInterfaceType( child ) ) {
463-
processElement( child, element );
464-
}
465-
}
466-
}
401+
inspectRootElement(element, parent, null);
467402
}
468403
catch ( ProcessLaterException processLaterException ) {
469404
if ( element instanceof TypeElement typeElement ) {
@@ -493,6 +428,77 @@ private boolean hasPackageAnnotation(Element element, String annotation) {
493428
return pack != null && hasAnnotation( pack, annotation );
494429
}
495430

431+
private void inspectRootElement(Element element, @Nullable Element parent, @Nullable TypeElement primaryEntity) {
432+
if ( !included( element )
433+
|| hasAnnotation( element, Constants.EXCLUDE )
434+
|| hasPackageAnnotation( element, Constants.EXCLUDE )
435+
|| element.getModifiers().contains( Modifier.PRIVATE ) ) {
436+
// skip it completely
437+
return;
438+
}
439+
else if ( isEntityOrEmbeddable( element )
440+
&& !element.getModifiers().contains( Modifier.PRIVATE ) ) {
441+
context.logMessage( Diagnostic.Kind.OTHER, "Processing annotated entity class '" + element + "'" );
442+
handleRootElementAnnotationMirrors( element, parent );
443+
}
444+
else if ( hasAuxiliaryAnnotations( element ) ) {
445+
context.logMessage( Diagnostic.Kind.OTHER, "Processing annotated class '" + element + "'" );
446+
handleRootElementAuxiliaryAnnotationMirrors( element );
447+
}
448+
else if ( element instanceof TypeElement typeElement ) {
449+
final AnnotationMirror repository = getAnnotationMirror( element, JD_REPOSITORY );
450+
if ( repository != null ) {
451+
final AnnotationValue provider = getAnnotationValue( repository, "provider" );
452+
if ( provider == null
453+
|| provider.getValue().toString().isEmpty()
454+
|| provider.getValue().toString().equalsIgnoreCase("hibernate") ) {
455+
context.logMessage( Diagnostic.Kind.OTHER, "Processing repository class '" + element + "'" );
456+
final AnnotationMetaEntity metaEntity =
457+
AnnotationMetaEntity.create( typeElement, context,
458+
parentMetadata( parent, context::getMetaEntity ),
459+
primaryEntity );
460+
if ( metaEntity.isInitialized() ) {
461+
context.addMetaAuxiliary( metaEntity.getQualifiedName(), metaEntity );
462+
}
463+
// otherwise discard it (assume it has query by magical method name stuff)
464+
}
465+
}
466+
else {
467+
for ( Element member : typeElement.getEnclosedElements() ) {
468+
if ( hasAnnotation( member, HQL, SQL, FIND ) ) {
469+
context.logMessage( Diagnostic.Kind.OTHER, "Processing annotated class '" + element + "'" );
470+
final AnnotationMetaEntity metaEntity =
471+
AnnotationMetaEntity.create( typeElement, context,
472+
parentMetadata( parent, context::getMetaEntity ),
473+
primaryEntity );
474+
context.addMetaAuxiliary( metaEntity.getQualifiedName(), metaEntity );
475+
break;
476+
}
477+
}
478+
if ( enclosesEntityOrEmbeddable( element ) ) {
479+
final NonManagedMetamodel metaEntity =
480+
NonManagedMetamodel.create( typeElement, context, false,
481+
parentMetadata( parent, context::getMetamodel ) );
482+
context.addMetaEntity( metaEntity.getQualifiedName(), metaEntity );
483+
if ( context.generateJakartaDataStaticMetamodel() ) {
484+
final NonManagedMetamodel dataMetaEntity =
485+
NonManagedMetamodel.create( typeElement, context, true,
486+
parentMetadata( parent, context::getDataMetaEntity ) );
487+
context.addDataMetaEntity( dataMetaEntity.getQualifiedName(), dataMetaEntity );
488+
}
489+
490+
}
491+
}
492+
}
493+
if ( isClassRecordOrInterfaceType( element ) ) {
494+
for ( final Element child : element.getEnclosedElements() ) {
495+
if ( isClassRecordOrInterfaceType( child ) ) {
496+
processElement( child, element );
497+
}
498+
}
499+
}
500+
}
501+
496502
private void createMetaModelClasses() {
497503

498504
for ( Metamodel aux : context.getMetaAuxiliaries() ) {
@@ -644,6 +650,7 @@ private void handleRootElementAnnotationMirrors(final Element element, @Nullable
644650
final TypeElement typeElement = (TypeElement) element;
645651
indexEntityName( typeElement );
646652
indexEnumFields( typeElement );
653+
indexQueryInterfaces( typeElement );
647654

648655
final String qualifiedName = typeElement.getQualifiedName().toString();
649656
final Metamodel alreadyExistingMetaEntity =
@@ -700,6 +707,14 @@ private static boolean hasHandwrittenMetamodel(Element element) {
700707
.contentEquals('_' + element.getSimpleName().toString()));
701708
}
702709

710+
private void indexQueryInterfaces(TypeElement typeElement) {
711+
for ( Element element : typeElement.getEnclosedElements() ) {
712+
if( element.getKind() == ElementKind.INTERFACE ) {
713+
inspectRootElement( element, typeElement, typeElement );
714+
}
715+
}
716+
}
717+
703718
private void indexEntityName(TypeElement typeElement) {
704719
final AnnotationMirror mirror = getAnnotationMirror( typeElement, ENTITY );
705720
if ( mirror != null ) {

0 commit comments

Comments
 (0)