Skip to content

Commit d3a1ebd

Browse files
cigalygavinking
authored andcommitted
HHH-18693 Changed code to allow creation of metadata for inner static non-private classes
Generaed metadate class for inner class A.B is A_.B_
1 parent d91d87c commit d3a1ebd

15 files changed

+415
-121
lines changed

tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java

Lines changed: 61 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@
44
*/
55
package org.hibernate.processor;
66

7+
import org.hibernate.processor.annotation.InnerClassMetaAttribute;
78
import org.hibernate.processor.model.MetaAttribute;
89
import org.hibernate.processor.model.Metamodel;
10+
import org.hibernate.processor.util.StringUtil;
911

1012
import javax.annotation.processing.FilerException;
13+
import javax.lang.model.element.Element;
1114
import javax.lang.model.element.ElementKind;
15+
import javax.lang.model.element.Modifier;
16+
import javax.lang.model.element.PackageElement;
1217
import javax.lang.model.element.TypeElement;
1318
import javax.tools.Diagnostic;
1419
import javax.tools.FileObject;
@@ -18,7 +23,12 @@
1823
import java.io.StringWriter;
1924
import java.time.OffsetDateTime;
2025
import java.time.format.DateTimeFormatter;
26+
import java.util.Arrays;
2127
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;
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
}

tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,15 @@ public Collection<Metamodel> getDataMetaEmbeddables() {
304304
return dataMetaEmbeddables.values();
305305
}
306306

307+
public @Nullable Metamodel getMetamodel(String qualifiedName) {
308+
if ( metaEntities.containsKey( qualifiedName ) ) {
309+
return metaEntities.get( qualifiedName );
310+
}
311+
else {
312+
return metaEmbeddables.get( qualifiedName );
313+
}
314+
}
315+
307316
public @Nullable Metamodel getMetaAuxiliary(String qualifiedName) {
308317
return metaAuxiliaries.get( qualifiedName );
309318
}

0 commit comments

Comments
 (0)