44 */
55package org .hibernate .processor ;
66
7+ import org .hibernate .processor .annotation .InnerClassMetaAttribute ;
78import org .hibernate .processor .model .MetaAttribute ;
89import org .hibernate .processor .model .Metamodel ;
10+ import org .hibernate .processor .util .StringUtil ;
911
1012import javax .annotation .processing .FilerException ;
13+ import javax .lang .model .element .Element ;
1114import javax .lang .model .element .ElementKind ;
15+ import javax .lang .model .element .Modifier ;
16+ import javax .lang .model .element .PackageElement ;
1217import javax .lang .model .element .TypeElement ;
1318import javax .tools .Diagnostic ;
1419import javax .tools .FileObject ;
1823import java .io .StringWriter ;
1924import java .time .OffsetDateTime ;
2025import java .time .format .DateTimeFormatter ;
26+ import java .util .Arrays ;
2127import java .util .List ;
28+ import java .util .Set ;
29+ import java .util .stream .Collectors ;
30+
31+ import static org .hibernate .processor .util .TypeUtils .isMemberType ;
2232
2333/**
2434 * Helper class to write the actual metamodel class using the {@link javax.annotation.processing.Filer} API.
@@ -39,7 +49,7 @@ public static void writeFile(Metamodel entity, Context context) {
3949 String body = generateBody ( entity , context ).toString ();
4050
4151 FileObject fo = context .getProcessingEnvironment ().getFiler ().createSourceFile (
42- getFullyQualifiedClassName ( entity , metaModelPackage ),
52+ getFullyQualifiedClassName ( entity ),
4353 entity .getElement ()
4454 );
4555 OutputStream os = fo .openOutputStream ();
@@ -101,6 +111,15 @@ private static StringBuffer generateBody(Metamodel entity, Context context) {
101111 pw .println ();
102112
103113 final List <MetaAttribute > members = entity .getMembers ();
114+ for ( MetaAttribute metaMember : members ) {
115+ if ( metaMember instanceof InnerClassMetaAttribute innerClass ) {
116+ generateBody ( innerClass .getMetaEntity (), context )
117+ .toString ().lines ()
118+ .forEach (line -> pw .println ('\t' + line ));
119+ context .markGenerated ( innerClass .getMetaEntity () );
120+ }
121+ }
122+
104123 for ( MetaAttribute metaMember : members ) {
105124 if ( metaMember .hasStringAttribute () ) {
106125 metaMember .getAttributeNameDeclarationString ().lines ()
@@ -133,16 +152,29 @@ private static StringBuffer generateBody(Metamodel entity, Context context) {
133152 }
134153
135154 private static void printClassDeclaration (Metamodel entity , PrintWriter pw ) {
136- pw .print ( "public " );
155+ if ( isMemberType ( entity .getElement () ) ) {
156+ final Set <Modifier > modifiers = entity .getElement ().getModifiers ();
157+ if ( modifiers .contains ( Modifier .PUBLIC ) ) {
158+ pw .print ( "public " );
159+ }
160+ else if ( modifiers .contains ( Modifier .PROTECTED ) ) {
161+ pw .print ( "protected " );
162+ }
163+ pw .print ( "static " );
164+ }
165+ else {
166+ pw .print ( "public " );
167+ }
137168 if ( !entity .isImplementation () && !entity .isJakartaDataStyle () ) {
138169 pw .print ( "abstract " );
139170 }
140171 pw .print ( entity .isJakartaDataStyle () ? "interface " : "class " );
141172 pw .print ( getGeneratedClassName (entity ) );
142173
143- String superClassName = entity .getSupertypeName ();
144- if ( superClassName != null ) {
145- pw .print ( " extends " + getGeneratedSuperclassName (entity , superClassName ) );
174+ final Element superTypeElement = entity .getSuperTypeElement ();
175+ if ( superTypeElement != null ) {
176+ pw .print ( " extends " +
177+ entity .importType (getGeneratedSuperclassName ( superTypeElement , entity .isJakartaDataStyle () )) );
146178 }
147179 if ( entity .isImplementation () ) {
148180 pw .print ( entity .getElement ().getKind () == ElementKind .CLASS ? " extends " : " implements " );
@@ -152,34 +184,36 @@ private static void printClassDeclaration(Metamodel entity, PrintWriter pw) {
152184 pw .println ( " {" );
153185 }
154186
155- private static String getFullyQualifiedClassName (Metamodel entity , String metaModelPackage ) {
156- String fullyQualifiedClassName = "" ;
157- if ( !metaModelPackage .isEmpty () ) {
158- fullyQualifiedClassName = fullyQualifiedClassName + metaModelPackage + "." ;
187+ private static String getFullyQualifiedClassName (Metamodel entity ) {
188+ final String metaModelPackage = entity .getPackageName ();
189+ final String packageNamePrefix = !metaModelPackage .isEmpty () ? metaModelPackage + "." : "" ;
190+ final String className ;
191+ if ( entity .getElement ().getKind () == ElementKind .PACKAGE ) {
192+ className = getGeneratedClassName ( entity );
159193 }
160- fullyQualifiedClassName = fullyQualifiedClassName + getGeneratedClassName ( entity );
161- return fullyQualifiedClassName ;
194+ else {
195+ className = Arrays .stream (
196+ entity .getQualifiedName ().substring ( packageNamePrefix .length () ).split ( "\\ ." ) )
197+ .map ( StringUtil ::removeDollar )
198+ .map ( part -> entity .isJakartaDataStyle () ? '_' + part : part + '_' )
199+ .collect ( Collectors .joining ( "." ) );
200+ }
201+ return packageNamePrefix + className ;
162202 }
163203
164204 private static String getGeneratedClassName (Metamodel entity ) {
165205 final String className = entity .getSimpleName ();
166206 return entity .isJakartaDataStyle () ? '_' + className : className + '_' ;
167207 }
168208
169- private static String getGeneratedSuperclassName (Metamodel entity , String superClassName ) {
170- if ( entity .isJakartaDataStyle () ) {
171- int lastDot = superClassName .lastIndexOf ('.' );
172- if ( lastDot <0 ) {
173- return '_' + superClassName ;
174- }
175- else {
176- return superClassName .substring (0 ,lastDot +1 )
177- + '_' + superClassName .substring (lastDot +1 );
178- }
179- }
180- else {
181- return superClassName + '_' ;
182- }
209+ private static String getGeneratedSuperclassName (Element superClassElement , boolean jakartaDataStyle ) {
210+ final TypeElement typeElement = (TypeElement ) superClassElement ;
211+ final String simpleName = typeElement .getSimpleName ().toString ();
212+ final Element enclosingElement = typeElement .getEnclosingElement ();
213+ return (enclosingElement instanceof TypeElement
214+ ? getGeneratedSuperclassName ( enclosingElement , jakartaDataStyle )
215+ : ((PackageElement ) enclosingElement ).getQualifiedName ().toString ())
216+ + "." + (jakartaDataStyle ? '_' + simpleName : simpleName + '_' );
183217 }
184218
185219 private static String writeGeneratedAnnotation (Metamodel entity , Context context ) {
@@ -227,6 +261,7 @@ private static String writeStaticMetaModelAnnotation(Metamodel entity) {
227261 final String annotation = entity .isJakartaDataStyle ()
228262 ? "jakarta.data.metamodel.StaticMetamodel"
229263 : "jakarta.persistence.metamodel.StaticMetamodel" ;
230- return "@" + entity .importType ( annotation ) + "(" + entity .getSimpleName () + ".class)" ;
264+ final String simpleName = entity .importType ( entity .getQualifiedName () );
265+ return "@" + entity .importType ( annotation ) + "(" + simpleName + ".class)" ;
231266 }
232267}
0 commit comments