Skip to content

Commit 0e03b66

Browse files
FroMagegavinking
authored andcommitted
[HHH-19586] Detect repositories nested in entities, for Panache2
1 parent 46afa23 commit 0e03b66

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
@@ -407,72 +407,7 @@ private void processClasses(RoundEnvironment roundEnvironment) {
407407

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

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

507513
for ( Metamodel aux : context.getMetaAuxiliaries() ) {
@@ -653,6 +659,7 @@ private void handleRootElementAnnotationMirrors(final Element element, @Nullable
653659
final TypeElement typeElement = (TypeElement) element;
654660
indexEntityName( typeElement );
655661
indexEnumFields( typeElement );
662+
indexQueryInterfaces( typeElement );
656663

657664
final String qualifiedName = typeElement.getQualifiedName().toString();
658665
final Metamodel alreadyExistingMetaEntity =
@@ -709,6 +716,14 @@ private static boolean hasHandwrittenMetamodel(Element element) {
709716
.contentEquals('_' + element.getSimpleName().toString()));
710717
}
711718

719+
private void indexQueryInterfaces(TypeElement typeElement) {
720+
for ( Element element : typeElement.getEnclosedElements() ) {
721+
if( element.getKind() == ElementKind.INTERFACE ) {
722+
inspectRootElement( element, typeElement, typeElement );
723+
}
724+
}
725+
}
726+
712727
private void indexEntityName(TypeElement typeElement) {
713728
final AnnotationMirror mirror = getAnnotationMirror( typeElement, ENTITY );
714729
if ( mirror != null ) {

0 commit comments

Comments
 (0)