@@ -468,6 +468,10 @@ && containsAnnotation( method, HQL, SQL, FIND ) ) {
468468			addPersistentMembers ( gettersAndSettersOfClass , AccessType .PROPERTY  );
469469
470470			addIdClassIfNeeded ( fieldsOfClass , gettersAndSettersOfClass  );
471+ 
472+ 			if ( hasAnnotation ( element , ENTITY ) && isPanache2Type (element ) && !jakartaDataStaticModel  ) {
473+ 				addRepositoryMembers ( element  );
474+ 			}
471475		}
472476
473477		addAuxiliaryMembers ();
@@ -521,6 +525,38 @@ private void addIdClassIfNeeded(List<VariableElement> fields, List<ExecutableEle
521525		}
522526	}
523527
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+ 
524560	private  List <MetaAttribute > getIdMemberNames (List <VariableElement > fields , List <ExecutableElement > methods ) {
525561		final  List <MetaAttribute > components  = new  ArrayList <>();
526562		for  ( var  field  : fields  ) {
@@ -648,6 +684,66 @@ private boolean isEquivalentPrimitiveType(TypeMirror type, TypeMirror match) {
648684			&& isSameType ( context .getTypeUtils ().boxedClass ( ((PrimitiveType ) type ) ).asType (), match  );
649685	}
650686
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+ 
651747	private  boolean  checkEntities (List <ExecutableElement > lifecycleMethods , boolean  hibernateRepo ) {
652748		boolean  foundPersistenceEntity  = false ;
653749		VariableElement  nonPersistenceParameter  = null ;
0 commit comments