30
30
import javax .lang .model .type .DeclaredType ;
31
31
import javax .lang .model .type .TypeKind ;
32
32
import javax .lang .model .type .TypeMirror ;
33
+ import javax .lang .model .util .Elements ;
33
34
import javax .tools .Diagnostic ;
34
35
import javax .tools .StandardLocation ;
35
36
import java .io .IOException ;
41
42
import java .util .List ;
42
43
import java .util .Map ;
43
44
import java .util .Set ;
45
+ import java .util .function .Function ;
44
46
45
47
import static java .lang .Boolean .parseBoolean ;
46
48
import static javax .lang .model .util .ElementFilter .fieldsIn ;
@@ -374,7 +376,8 @@ private void processElement(Element element, @Nullable Element parent) {
374
376
// skip it completely
375
377
return ;
376
378
}
377
- else if ( isEntityOrEmbeddable ( element ) && !element .getModifiers ().contains ( Modifier .PRIVATE )) {
379
+ else if ( isEntityOrEmbeddable ( element )
380
+ && !element .getModifiers ().contains ( Modifier .PRIVATE ) ) {
378
381
context .logMessage ( Diagnostic .Kind .OTHER , "Processing annotated entity class '" + element + "'" );
379
382
handleRootElementAnnotationMirrors ( element , parent );
380
383
}
@@ -409,30 +412,14 @@ else if ( element instanceof TypeElement typeElement ) {
409
412
}
410
413
}
411
414
if ( enclosesEntityOrEmbeddable ( element ) ) {
412
- AnnotationMetaEntity parentMeta = null ;
413
- if ( parent instanceof TypeElement parentElement ) {
414
- final String key = parentElement .getQualifiedName ().toString ();
415
- if ( context .getMetamodel ( key ) instanceof AnnotationMetaEntity parentMetaEntity ) {
416
- parentMeta = parentMetaEntity ;
417
- }
418
- }
419
- final NonManagedMetamodel metaEntity =
420
- NonManagedMetamodel .create (
421
- typeElement , context ,
422
- false , parentMeta );
415
+ final NonManagedMetamodel metaEntity =
416
+ NonManagedMetamodel .create ( typeElement , context , false ,
417
+ parentMetadata ( parent , context ::getMetamodel ) );
423
418
context .addMetaEntity ( metaEntity .getQualifiedName (), metaEntity );
424
- if ( context .generateJakartaDataStaticMetamodel ()) {
425
- AnnotationMetaEntity parentDataMeta = null ;
426
- if ( parent instanceof TypeElement parentElement ) {
427
- final String key = parentElement .getQualifiedName ().toString ();
428
- if ( context .getDataMetaEntity ( key ) instanceof AnnotationMetaEntity parentMetaEntity ) {
429
- parentDataMeta = parentMetaEntity ;
430
- }
431
- }
432
- final NonManagedMetamodel dataMetaEntity =
433
- NonManagedMetamodel .create (
434
- typeElement , context ,
435
- true , parentDataMeta );
419
+ if ( context .generateJakartaDataStaticMetamodel () ) {
420
+ final NonManagedMetamodel dataMetaEntity =
421
+ NonManagedMetamodel .create ( typeElement , context , true ,
422
+ parentMetadata ( parent , context ::getDataMetaEntity ) );
436
423
context .addDataMetaEntity ( dataMetaEntity .getQualifiedName (), dataMetaEntity );
437
424
}
438
425
@@ -448,16 +435,28 @@ else if ( element instanceof TypeElement typeElement ) {
448
435
}
449
436
}
450
437
catch ( ProcessLaterException processLaterException ) {
451
- if ( element instanceof TypeElement ) {
438
+ if ( element instanceof TypeElement typeElement ) {
452
439
context .logMessage (
453
440
Diagnostic .Kind .OTHER ,
454
441
"Could not process '" + element + "' (will redo in next round)"
455
442
);
456
- context .addElementToRedo ( ( ( TypeElement ) element ) .getQualifiedName () );
443
+ context .addElementToRedo ( typeElement .getQualifiedName () );
457
444
}
458
445
}
459
446
}
460
447
448
+ private @ Nullable AnnotationMetaEntity parentMetadata (
449
+ @ Nullable Element parent , Function <String , @ Nullable Object > metamodel ) {
450
+ if ( parent instanceof TypeElement parentElement
451
+ && metamodel .apply ( parentElement .getQualifiedName ().toString () )
452
+ instanceof AnnotationMetaEntity parentMetaEntity ) {
453
+ return parentMetaEntity ;
454
+ }
455
+ else {
456
+ return null ;
457
+ }
458
+ }
459
+
461
460
private boolean hasPackageAnnotation (Element element , String annotation ) {
462
461
final PackageElement pack = context .getElementUtils ().getPackageOf ( element ); // null for module descriptor
463
462
return pack != null && hasAnnotation ( pack , annotation );
@@ -562,15 +561,18 @@ private boolean modelGenerationNeedsToBeDeferred(Collection<Metamodel> entities,
562
561
}
563
562
564
563
private static boolean enclosesEntityOrEmbeddable (Element element ) {
565
- if ( !(element instanceof TypeElement typeElement ) ) {
564
+ if ( element instanceof TypeElement typeElement ) {
565
+ for ( final Element enclosedElement : typeElement .getEnclosedElements () ) {
566
+ if ( isEntityOrEmbeddable ( enclosedElement )
567
+ || enclosesEntityOrEmbeddable ( enclosedElement ) ) {
568
+ return true ;
569
+ }
570
+ }
566
571
return false ;
567
572
}
568
- for ( final Element enclosedElement : typeElement .getEnclosedElements () ) {
569
- if ( isEntityOrEmbeddable ( enclosedElement ) || enclosesEntityOrEmbeddable ( enclosedElement ) ) {
570
- return true ;
571
- }
573
+ else {
574
+ return false ;
572
575
}
573
- return false ;
574
576
}
575
577
576
578
private static boolean isEntityOrEmbeddable (Element element ) {
@@ -621,14 +623,8 @@ private void handleRootElementAnnotationMirrors(final Element element, @Nullable
621
623
+ "' since XML configuration is metadata complete." );
622
624
}
623
625
else {
624
- AnnotationMetaEntity parentMetaEntity = null ;
625
- if ( parent instanceof TypeElement parentTypeElement ) {
626
- if ( context .getMetamodel (
627
- parentTypeElement .getQualifiedName ().toString () )
628
- instanceof AnnotationMetaEntity pme ) {
629
- parentMetaEntity = pme ;
630
- }
631
- }
626
+ final AnnotationMetaEntity parentMetaEntity =
627
+ parentMetadata ( parent , context ::getMetamodel );
632
628
final boolean requiresLazyMemberInitialization
633
629
= hasAnnotation ( element , EMBEDDABLE , MAPPED_SUPERCLASS );
634
630
final AnnotationMetaEntity metaEntity =
@@ -648,13 +644,8 @@ && hasAnnotation( element, ENTITY, MAPPED_SUPERCLASS )
648
644
// let a handwritten metamodel "override" the generated one
649
645
// (this is used in the Jakarta Data TCK)
650
646
&& !hasHandwrittenMetamodel (element ) ) {
651
- AnnotationMetaEntity parentDataEntity = null ;
652
- if ( parent instanceof TypeElement parentTypeElement ) {
653
- if ( context .getDataMetaEntity ( parentTypeElement .getQualifiedName ().toString () )
654
- instanceof AnnotationMetaEntity pme ) {
655
- parentDataEntity = pme ;
656
- }
657
- }
647
+ final AnnotationMetaEntity parentDataEntity =
648
+ parentMetadata ( parent , context ::getDataMetaEntity );
658
649
final AnnotationMetaEntity dataMetaEntity =
659
650
AnnotationMetaEntity .create ( typeElement , context ,
660
651
requiresLazyMemberInitialization ,
@@ -783,13 +774,14 @@ else if ( hasAnnotation( typeElement, EMBEDDABLE ) ) {
783
774
784
775
private void writeIndex () {
785
776
final ProcessingEnvironment processingEnvironment = context .getProcessingEnvironment ();
777
+ final Elements elementUtils = processingEnvironment .getElementUtils ();
786
778
context .getEntityNameMappings ().forEach ((entityName , className ) -> {
787
779
try (Writer writer = processingEnvironment .getFiler ()
788
780
.createResource (
789
781
StandardLocation .SOURCE_OUTPUT ,
790
782
ENTITY_INDEX ,
791
783
entityName ,
792
- processingEnvironment . getElementUtils () .getTypeElement ( className )
784
+ elementUtils .getTypeElement ( className )
793
785
)
794
786
.openWriter ()) {
795
787
writer .append (className );
@@ -801,11 +793,12 @@ private void writeIndex() {
801
793
}
802
794
});
803
795
context .getEnumTypesByValue ().forEach ((valueName , enumTypeNames ) -> {
804
- try (Writer writer = processingEnvironment .getFiler ().createResource (
796
+ try (Writer writer = processingEnvironment .getFiler ()
797
+ .createResource (
805
798
StandardLocation .SOURCE_OUTPUT ,
806
799
ENTITY_INDEX ,
807
800
'.' + valueName ,
808
- processingEnvironment . getElementUtils () .getTypeElement ( enumTypeNames .iterator ().next () )
801
+ elementUtils .getTypeElement ( enumTypeNames .iterator ().next () )
809
802
)
810
803
.openWriter ()) {
811
804
for (String enumTypeName : enumTypeNames ) {
0 commit comments