4
4
*/
5
5
package org .hibernate .processor ;
6
6
7
+ import org .hibernate .processor .annotation .InnerClassMetaAttribute ;
7
8
import org .hibernate .processor .model .MetaAttribute ;
8
9
import org .hibernate .processor .model .Metamodel ;
10
+ import org .hibernate .processor .util .StringUtil ;
9
11
10
12
import javax .annotation .processing .FilerException ;
13
+ import javax .lang .model .element .Element ;
11
14
import javax .lang .model .element .ElementKind ;
15
+ import javax .lang .model .element .Modifier ;
16
+ import javax .lang .model .element .PackageElement ;
12
17
import javax .lang .model .element .TypeElement ;
13
18
import javax .tools .Diagnostic ;
14
19
import javax .tools .FileObject ;
18
23
import java .io .StringWriter ;
19
24
import java .time .OffsetDateTime ;
20
25
import java .time .format .DateTimeFormatter ;
26
+ import java .util .Arrays ;
21
27
import java .util .List ;
28
+ import java .util .Set ;
29
+ import java .util .stream .Collectors ;
30
+
31
+ import static org .hibernate .processor .util .TypeUtils .isMemberType ;
22
32
23
33
/**
24
34
* 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) {
39
49
String body = generateBody ( entity , context ).toString ();
40
50
41
51
FileObject fo = context .getProcessingEnvironment ().getFiler ().createSourceFile (
42
- getFullyQualifiedClassName ( entity , metaModelPackage ),
52
+ getFullyQualifiedClassName ( entity ),
43
53
entity .getElement ()
44
54
);
45
55
OutputStream os = fo .openOutputStream ();
@@ -101,6 +111,15 @@ private static StringBuffer generateBody(Metamodel entity, Context context) {
101
111
pw .println ();
102
112
103
113
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
+
104
123
for ( MetaAttribute metaMember : members ) {
105
124
if ( metaMember .hasStringAttribute () ) {
106
125
metaMember .getAttributeNameDeclarationString ().lines ()
@@ -133,16 +152,29 @@ private static StringBuffer generateBody(Metamodel entity, Context context) {
133
152
}
134
153
135
154
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
+ }
137
168
if ( !entity .isImplementation () && !entity .isJakartaDataStyle () ) {
138
169
pw .print ( "abstract " );
139
170
}
140
171
pw .print ( entity .isJakartaDataStyle () ? "interface " : "class " );
141
172
pw .print ( getGeneratedClassName (entity ) );
142
173
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 () )) );
146
178
}
147
179
if ( entity .isImplementation () ) {
148
180
pw .print ( entity .getElement ().getKind () == ElementKind .CLASS ? " extends " : " implements " );
@@ -152,34 +184,36 @@ private static void printClassDeclaration(Metamodel entity, PrintWriter pw) {
152
184
pw .println ( " {" );
153
185
}
154
186
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 );
159
193
}
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 ;
162
202
}
163
203
164
204
private static String getGeneratedClassName (Metamodel entity ) {
165
205
final String className = entity .getSimpleName ();
166
206
return entity .isJakartaDataStyle () ? '_' + className : className + '_' ;
167
207
}
168
208
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 + '_' );
183
217
}
184
218
185
219
private static String writeGeneratedAnnotation (Metamodel entity , Context context ) {
@@ -227,6 +261,7 @@ private static String writeStaticMetaModelAnnotation(Metamodel entity) {
227
261
final String annotation = entity .isJakartaDataStyle ()
228
262
? "jakarta.data.metamodel.StaticMetamodel"
229
263
: "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)" ;
231
266
}
232
267
}
0 commit comments