@@ -468,6 +468,10 @@ && containsAnnotation( method, HQL, SQL, FIND ) ) {
468
468
addPersistentMembers ( gettersAndSettersOfClass , AccessType .PROPERTY );
469
469
470
470
addIdClassIfNeeded ( fieldsOfClass , gettersAndSettersOfClass );
471
+
472
+ if ( hasAnnotation ( element , ENTITY ) && isPanache2Type (element ) && !jakartaDataStaticModel ) {
473
+ addRepositoryMembers ( element );
474
+ }
471
475
}
472
476
473
477
addAuxiliaryMembers ();
@@ -521,6 +525,38 @@ private void addIdClassIfNeeded(List<VariableElement> fields, List<ExecutableEle
521
525
}
522
526
}
523
527
528
+ private void addRepositoryMembers (TypeElement element ) {
529
+ Element managedBlockingRepository = null ;
530
+ Element statelessBlockingRepository = null ;
531
+ Element managedReactiveRepository = null ;
532
+ Element statelessReactiveRepository = null ;
533
+ for ( Element enclosedElement : element .getEnclosedElements () ) {
534
+ if ( enclosedElement .getKind () == ElementKind .INTERFACE ) {
535
+ members .put ( enclosedElement .getSimpleName ().toString (), new CDIAccessorMetaAttribute ( this , enclosedElement ) );
536
+ if ( implementsInterface ( (TypeElement ) enclosedElement , Constants .PANACHE2_MANAGED_BLOCKING_REPOSITORY_BASE ) ) {
537
+ managedBlockingRepository = enclosedElement ;
538
+ } else if ( implementsInterface ( (TypeElement ) enclosedElement , Constants .PANACHE2_STATELESS_BLOCKING_REPOSITORY_BASE ) ) {
539
+ statelessBlockingRepository = enclosedElement ;
540
+ } else if ( implementsInterface ( (TypeElement ) enclosedElement , Constants .PANACHE2_MANAGED_REACTIVE_REPOSITORY_BASE ) ) {
541
+ managedReactiveRepository = enclosedElement ;
542
+ } else if ( implementsInterface ( (TypeElement ) enclosedElement , Constants .PANACHE2_STATELESS_REACTIVE_REPOSITORY_BASE ) ) {
543
+ statelessReactiveRepository = enclosedElement ;
544
+ }
545
+ }
546
+ }
547
+ if ( quarkusInjection ) {
548
+ // FIXME: perhaps import id type?
549
+ TypeMirror idType = findIdType ();
550
+ addAccessors (managedBlockingRepository , idType , "managedBlocking" , PANACHE2_MANAGED_BLOCKING_REPOSITORY_BASE );
551
+ addAccessors (statelessBlockingRepository , idType , "statelessBlocking" , PANACHE2_STATELESS_BLOCKING_REPOSITORY_BASE );
552
+ // Only add those if HR is in the classpath, otherwise it causes a compilation issue
553
+ if ( context .usesQuarkusReactiveCommon () ) {
554
+ addAccessors (managedReactiveRepository , idType , "managedReactive" , PANACHE2_MANAGED_REACTIVE_REPOSITORY_BASE );
555
+ addAccessors (statelessReactiveRepository , idType , "statelessReactive" , PANACHE2_STATELESS_REACTIVE_REPOSITORY_BASE );
556
+ }
557
+ }
558
+ }
559
+
524
560
private List <MetaAttribute > getIdMemberNames (List <VariableElement > fields , List <ExecutableElement > methods ) {
525
561
final List <MetaAttribute > components = new ArrayList <>();
526
562
for ( var field : fields ) {
@@ -648,6 +684,66 @@ private boolean isEquivalentPrimitiveType(TypeMirror type, TypeMirror match) {
648
684
&& isSameType ( context .getTypeUtils ().boxedClass ( ((PrimitiveType ) type ) ).asType (), match );
649
685
}
650
686
687
+ private void addAccessors (@ Nullable Element repositoryType , @ Nullable TypeMirror idType ,
688
+ String repositoryAccessor , String repositorySuperType ) {
689
+ TypeElement finalPrimaryEntity = primaryEntity ;
690
+ if ( repositoryType != null ) {
691
+ members .put ( repositoryAccessor , new CDIAccessorMetaAttribute ( this , repositoryAccessor , repositoryType .getSimpleName ().toString () ) );
692
+ } else if ( idType != null && finalPrimaryEntity != null ) {
693
+ String repositoryTypeName = "Panache" +repositoryAccessor .substring (0 ,1 ).toUpperCase ()+repositoryAccessor .substring (1 )+"Repository" ;
694
+ members .put ( repositoryAccessor , new CDIAccessorMetaAttribute ( this , repositoryAccessor , repositoryTypeName ) );
695
+ members .put ( repositoryAccessor + "Repository" , new CDITypeMetaAttribute ( this , repositoryTypeName , repositorySuperType +"<" + finalPrimaryEntity .getSimpleName ()+", " + idType .toString ()+">" ) );
696
+ }
697
+ }
698
+
699
+ private @ Nullable TypeMirror findIdType () {
700
+ Element idMember = findIdMember ();
701
+ TypeElement primaryEntityForTest = primaryEntity ;
702
+ if ( idMember != null && primaryEntityForTest != null ) {
703
+ TypeMirror typedIdMember = this .context .getTypeUtils ().asMemberOf ((DeclaredType ) primaryEntityForTest .asType (), idMember );
704
+ TypeMirror idType = null ;
705
+ switch (typedIdMember .getKind ()) {
706
+ case ARRAY :
707
+ case DECLARED :
708
+ case BOOLEAN :
709
+ case BYTE :
710
+ case CHAR :
711
+ case SHORT :
712
+ case INT :
713
+ case LONG :
714
+ case FLOAT :
715
+ case DOUBLE :
716
+ return typedIdMember ;
717
+ case EXECUTABLE :
718
+ return ((ExecutableType ) typedIdMember ).getReturnType ();
719
+ default :
720
+ message ( element ,
721
+ "Unhandled id member kind: " +typedIdMember +" for id " +idMember ,
722
+ Diagnostic .Kind .ERROR );
723
+ return null ;
724
+ }
725
+ }
726
+ return null ;
727
+ }
728
+
729
+ private @ Nullable Element findIdMember () {
730
+ if ( primaryEntity == null ) {
731
+ message ( element ,
732
+ "No primary entity defined to find id member" ,
733
+ Diagnostic .Kind .ERROR );
734
+ return null ;
735
+ }
736
+ for ( Element member : context .getAllMembers ( primaryEntity ) ) {
737
+ if ( hasAnnotation ( member , ID , EMBEDDED_ID ) ) {
738
+ return member ;
739
+ }
740
+ }
741
+ message ( element ,
742
+ "Could not find any member annotated with @Id or @EmbeddedId" ,
743
+ Diagnostic .Kind .ERROR );
744
+ return null ;
745
+ }
746
+
651
747
private boolean checkEntities (List <ExecutableElement > lifecycleMethods , boolean hibernateRepo ) {
652
748
boolean foundPersistenceEntity = false ;
653
749
VariableElement nonPersistenceParameter = null ;
0 commit comments