Skip to content

Commit 4aea444

Browse files
committed
HHH-18693 Fixing to work with Jakarta Data annotations; properly naming metadata classes
1 parent 517eac9 commit 4aea444

File tree

11 files changed

+93
-107
lines changed

11 files changed

+93
-107
lines changed

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

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

7-
import jakarta.annotation.Nullable;
8-
import org.hibernate.processor.annotation.AnnotationMetaEntity;
97
import org.hibernate.processor.annotation.InnerClassMetaAttribute;
108
import org.hibernate.processor.model.MetaAttribute;
119
import org.hibernate.processor.model.Metamodel;
10+
import org.hibernate.processor.util.StringUtil;
1211

1312
import javax.annotation.processing.FilerException;
13+
import javax.lang.model.element.Element;
1414
import javax.lang.model.element.ElementKind;
1515
import javax.lang.model.element.Modifier;
16+
import javax.lang.model.element.PackageElement;
1617
import javax.lang.model.element.TypeElement;
1718
import javax.tools.Diagnostic;
1819
import javax.tools.FileObject;
@@ -27,6 +28,7 @@
2728
import java.util.Set;
2829
import java.util.stream.Collectors;
2930

31+
import static org.hibernate.processor.util.TypeUtils.isMemberType;
3032

3133
/**
3234
* Helper class to write the actual metamodel class using the {@link javax.annotation.processing.Filer} API.
@@ -40,7 +42,6 @@ private ClassWriter() {
4042
}
4143

4244
public static void writeFile(Metamodel entity, Context context) {
43-
if (entity.hasParent()) throw new IllegalStateException();
4445
try {
4546
String metaModelPackage = entity.getPackageName();
4647
// need to generate the body first, since this will also update
@@ -105,7 +106,7 @@ private static StringBuffer generateBody(Metamodel entity, Context context) {
105106
}
106107
entity.inheritedAnnotations().forEach(pw::println);
107108

108-
printClassDeclaration( entity, pw, context );
109+
printClassDeclaration( entity, pw );
109110

110111
pw.println();
111112

@@ -115,6 +116,7 @@ private static StringBuffer generateBody(Metamodel entity, Context context) {
115116
generateBody( innerClass.getMetaEntity(), context )
116117
.toString().lines()
117118
.forEach(line -> pw.println('\t' + line));
119+
context.markGenerated( innerClass.getMetaEntity() );
118120
}
119121
}
120122

@@ -149,12 +151,13 @@ private static StringBuffer generateBody(Metamodel entity, Context context) {
149151
}
150152
}
151153

152-
private static void printClassDeclaration(Metamodel entity, PrintWriter pw, Context context) {
153-
if ( entity.hasParent() ) {
154+
private static void printClassDeclaration(Metamodel entity, PrintWriter pw) {
155+
if ( isMemberType( entity.getElement() ) ) {
154156
final Set<Modifier> modifiers = entity.getElement().getModifiers();
155-
if (modifiers.contains( Modifier.PUBLIC )){
157+
if ( modifiers.contains( Modifier.PUBLIC ) ) {
156158
pw.print( "public " );
157-
}else if (modifiers.contains( Modifier.PROTECTED )) {
159+
}
160+
else if ( modifiers.contains( Modifier.PROTECTED ) ) {
158161
pw.print( "protected " );
159162
}
160163
pw.print( "static " );
@@ -168,70 +171,49 @@ private static void printClassDeclaration(Metamodel entity, PrintWriter pw, Cont
168171
pw.print( entity.isJakartaDataStyle() ? "interface " : "class " );
169172
pw.print( getGeneratedClassName(entity) );
170173

171-
String superClassName = entity.getSupertypeName();
172-
if ( superClassName != null ) {
173-
Metamodel superClassEntity = context.getMetaEntity( superClassName );
174-
if (superClassEntity == null) {
175-
superClassEntity = context.getMetaEmbeddable( superClassName );
176-
}
177-
final String superclassName = getGeneratedSuperclassName(
178-
superClassName, superClassEntity, entity.isJakartaDataStyle() );
179-
if (entity.getSimpleName().equals( "OffsetDateTimeTest" )) {
180-
System.err.printf( "Extends (?) %s - superClassName is not null%n", superClassName );
181-
}
182-
pw.print( " extends " + entity.importType(superclassName) );
174+
final Element superTypeElement = entity.getSuperTypeElement();
175+
if ( superTypeElement != null ) {
176+
pw.print( " extends " +
177+
entity.importType(getGeneratedSuperclassName( superTypeElement, entity.isJakartaDataStyle() )) );
183178
}
184179
if ( entity.isImplementation() ) {
185180
pw.print( entity.getElement().getKind() == ElementKind.CLASS ? " extends " : " implements " );
186181
pw.print( entity.getSimpleName() );
187-
if (entity.getSimpleName().equals( "OffsetDateTimeTest" )) {
188-
System.err.printf( "Extends (?) %s -- implementation (?!?)%n", entity.getSimpleName() );
189-
}
190182
}
191183

192184
pw.println( " {" );
193185
}
194186

195187
private static String getFullyQualifiedClassName(Metamodel entity) {
196188
final String metaModelPackage = entity.getPackageName();
197-
String fullyQualifiedClassName = "";
198-
if ( !metaModelPackage.isEmpty() ) {
199-
fullyQualifiedClassName = fullyQualifiedClassName + metaModelPackage + ".";
200-
}
189+
final String packageNamePrefix = !metaModelPackage.isEmpty() ? metaModelPackage + "." : "";
201190
final String className;
202191
if ( entity.getElement().getKind() == ElementKind.PACKAGE ) {
203192
className = getGeneratedClassName( entity );
204193
}
205194
else {
206195
className = Arrays.stream(
207-
entity.getQualifiedName().substring( fullyQualifiedClassName.length() ).split( "\\." ) )
208-
.map( AnnotationMetaEntity::removeDollar )
196+
entity.getQualifiedName().substring( packageNamePrefix.length() ).split( "\\." ) )
197+
.map( StringUtil::removeDollar )
209198
.map( part -> entity.isJakartaDataStyle() ? '_' + part : part + '_' )
210199
.collect( Collectors.joining( "." ) );
211200
}
212-
return fullyQualifiedClassName + className;
201+
return packageNamePrefix + className;
213202
}
214203

215204
private static String getGeneratedClassName(Metamodel entity) {
216205
final String className = entity.getSimpleName();
217-
return entity.isJakartaDataStyle() ? '_' + className : className + '_'; // TODO : check inner class!!!
206+
return entity.isJakartaDataStyle() ? '_' + className : className + '_';
218207
}
219208

220-
private static String getGeneratedSuperclassName(String superClassName, @Nullable Metamodel superClassEntity, boolean jakartaDataStyle) {
221-
if ( jakartaDataStyle ) {
222-
int lastDot = superClassName.lastIndexOf('.');
223-
if ( lastDot<0 ) {
224-
return '_' + superClassName;
225-
}
226-
else {
227-
return superClassName.substring(0,lastDot+1)
228-
+ '_' + superClassName.substring(lastDot+1);
229-
}
230-
}
231-
else {
232-
return superClassEntity == null ? superClassName + '_'
233-
: getFullyQualifiedClassName( superClassEntity );
234-
}
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 + '_');
235217
}
236218

237219
private static String writeGeneratedAnnotation(Metamodel entity, Context context) {

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

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
import static org.hibernate.processor.util.TypeUtils.getAnnotationValue;
8585
import static org.hibernate.processor.util.TypeUtils.hasAnnotation;
8686
import static org.hibernate.processor.util.TypeUtils.isClassOrRecordType;
87+
import static org.hibernate.processor.util.TypeUtils.isMemberType;
8788

8889
/**
8990
* Main annotation processor.
@@ -371,6 +372,7 @@ private void processElement(Element element, @Nullable Element parent) {
371372
|| hasPackageAnnotation( element, Constants.EXCLUDE )
372373
|| element.getModifiers().contains( Modifier.PRIVATE ) ) {
373374
// skip it completely
375+
return;
374376
}
375377
else if ( isEntityOrEmbeddable( element ) && !element.getModifiers().contains( Modifier.PRIVATE )) {
376378
context.logMessage( Diagnostic.Kind.OTHER, "Processing annotated entity class '" + element + "'" );
@@ -414,14 +416,26 @@ else if ( element instanceof TypeElement typeElement ) {
414416
parentMeta = parentMetaEntity;
415417
}
416418
}
417-
if (element.getSimpleName().toString().equals( "OffsetDateTimeTest" )) {
418-
System.err.println("Create OffsetDateTimeTest as non-entity class#1");
419-
}
420419
final NonManagedMetamodel metaEntity =
421420
NonManagedMetamodel .create(
422421
typeElement, context,
423-
parentMeta );
422+
false, parentMeta );
424423
context.addMetaEntity( metaEntity.getQualifiedName(), metaEntity );
424+
if ( context.generateJakartaDataStaticMetamodel()) {
425+
AnnotationMetaEntity parentDataMeta = null;
426+
if ( parent instanceof TypeElement parentElement ) {
427+
final String key = parentElement.getQualifiedName().toString();
428+
if ( context.getDataMetaEntity( key ) instanceof AnnotationMetaEntity parentMetaEntity ) {
429+
parentDataMeta = parentMetaEntity;
430+
}
431+
}
432+
final NonManagedMetamodel dataMetaEntity =
433+
NonManagedMetamodel .create(
434+
typeElement, context,
435+
true, parentDataMeta );
436+
context.addDataMetaEntity( dataMetaEntity.getQualifiedName(), dataMetaEntity );
437+
}
438+
425439
}
426440
}
427441
}
@@ -461,16 +475,7 @@ private void createMetaModelClasses() {
461475
}
462476

463477
for ( Metamodel entity : context.getMetaEntities() ) {
464-
if ( !context.isAlreadyGenerated(entity) && !entity.hasParent()) {
465-
context.logMessage( Diagnostic.Kind.OTHER,
466-
"Writing Jakarta Persistence metamodel for entity '" + entity + "'" );
467-
ClassWriter.writeFile( entity, context );
468-
context.markGenerated(entity);
469-
}
470-
}
471-
472-
for ( Metamodel entity : context.getMetaEntities() ) {
473-
if ( !context.isAlreadyGenerated(entity) && !entity.hasParent()) {
478+
if ( !context.isAlreadyGenerated( entity ) && !isMemberType( entity.getElement() ) ) {
474479
context.logMessage( Diagnostic.Kind.OTHER,
475480
"Writing Jakarta Persistence metamodel for entity '" + entity + "'" );
476481
ClassWriter.writeFile( entity, context );
@@ -479,7 +484,7 @@ private void createMetaModelClasses() {
479484
}
480485

481486
for ( Metamodel entity : context.getDataMetaEntities() ) {
482-
if ( !context.isAlreadyGenerated(entity) ) {
487+
if ( !context.isAlreadyGenerated( entity ) && !isMemberType( entity.getElement() ) ) {
483488
context.logMessage( Diagnostic.Kind.OTHER,
484489
"Writing Jakarta Data metamodel for entity '" + entity + "'" );
485490
ClassWriter.writeFile( entity, context );
@@ -502,7 +507,7 @@ private void processEmbeddables(Collection<Metamodel> models) {
502507
final int toProcessCountBeforeLoop = models.size();
503508
for ( Metamodel metamodel : models ) {
504509
// see METAGEN-36
505-
if ( context.isAlreadyGenerated(metamodel) || metamodel.hasParent()) {
510+
if ( context.isAlreadyGenerated(metamodel) ) {
506511
processed.add( metamodel );
507512
}
508513
else if ( !modelGenerationNeedsToBeDeferred(models, metamodel ) ) {
@@ -626,9 +631,6 @@ private void handleRootElementAnnotationMirrors(final Element element, @Nullable
626631
}
627632
final boolean requiresLazyMemberInitialization
628633
= hasAnnotation( element, EMBEDDABLE, MAPPED_SUPERCLASS );
629-
if (element.getSimpleName().toString().equals( "OffsetDateTimeTest" )) {
630-
System.err.println("Create OffsetDateTimeTest in handleRootElementAnnotationMirrors#2");
631-
}
632634
final AnnotationMetaEntity metaEntity =
633635
AnnotationMetaEntity.create( typeElement, context,
634636
requiresLazyMemberInitialization,
@@ -646,13 +648,17 @@ && hasAnnotation( element, ENTITY, MAPPED_SUPERCLASS )
646648
// let a handwritten metamodel "override" the generated one
647649
// (this is used in the Jakarta Data TCK)
648650
&& !hasHandwrittenMetamodel(element) ) {
649-
if (element.getSimpleName().toString().equals( "OffsetDateTimeTest" )) {
650-
System.err.println("Create OffsetDateTimeTest in handleRootElementAnnotationMirrors#3");
651+
AnnotationMetaEntity parentDataEntity = null;
652+
if ( parent instanceof TypeElement parentTypeElement ) {
653+
if ( context.getDataMetaEntity( parentTypeElement.getQualifiedName().toString() )
654+
instanceof AnnotationMetaEntity pme ) {
655+
parentDataEntity = pme;
656+
}
651657
}
652658
final AnnotationMetaEntity dataMetaEntity =
653659
AnnotationMetaEntity.create( typeElement, context,
654660
requiresLazyMemberInitialization,
655-
true, true, parentMetaEntity );
661+
true, true, parentDataEntity );
656662
// final Metamodel alreadyExistingDataMetaEntity =
657663
// tryGettingExistingDataEntityFromContext( mirror, '_' + qualifiedName );
658664
// if ( alreadyExistingDataMetaEntity != null ) {

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

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,12 @@
8080
import static org.hibernate.processor.annotation.QueryMethod.isPageParam;
8181
import static org.hibernate.processor.util.Constants.*;
8282
import static org.hibernate.processor.util.NullnessUtil.castNonNull;
83+
import static org.hibernate.processor.util.StringUtil.removeDollar;
8384
import static org.hibernate.processor.util.TypeUtils.containsAnnotation;
8485
import static org.hibernate.processor.util.TypeUtils.determineAccessTypeForHierarchy;
8586
import static org.hibernate.processor.util.TypeUtils.determineAnnotationSpecifiedAccessType;
8687
import static org.hibernate.processor.util.TypeUtils.extendsClass;
87-
import static org.hibernate.processor.util.TypeUtils.findMappedSuperClass;
88+
import static org.hibernate.processor.util.TypeUtils.findMappedSuperElement;
8889
import static org.hibernate.processor.util.TypeUtils.getAnnotationMirror;
8990
import static org.hibernate.processor.util.TypeUtils.getAnnotationValue;
9091
import static org.hibernate.processor.util.TypeUtils.hasAnnotation;
@@ -232,18 +233,6 @@ private String getConstructorName() {
232233
return getSimpleName() + '_';
233234
}
234235

235-
/**
236-
* If this is an "intermediate" class providing {@code @Query}
237-
* annotations for the query by magical method name crap, then
238-
* by convention it will be named with a trailing $ sign. Strip
239-
* that off, so we get the standard constructor.
240-
*/
241-
public static String removeDollar(String simpleName) {
242-
return simpleName.endsWith("$")
243-
? simpleName.substring(0, simpleName.length()-1)
244-
: simpleName;
245-
}
246-
247236
@Override
248237
public final String getQualifiedName() {
249238
if ( qualifiedName == null ) {
@@ -253,8 +242,8 @@ public final String getQualifiedName() {
253242
}
254243

255244
@Override
256-
public @Nullable String getSupertypeName() {
257-
return repository ? null : findMappedSuperClass( this, context );
245+
public @Nullable Element getSuperTypeElement() {
246+
return repository ? null : findMappedSuperElement( this, context );
258247
}
259248

260249
@Override
@@ -278,12 +267,7 @@ public List<MetaAttribute> getMembers() {
278267
}
279268

280269
public void addInnerClass(AnnotationMetaEntity metaEntity) {
281-
putMember( "INNER_"+ metaEntity.getQualifiedName(), new InnerClassMetaAttribute( metaEntity ) );
282-
}
283-
284-
@Override
285-
public boolean hasParent() {
286-
return parentElement != null;
270+
putMember( "INNER_" + metaEntity.getQualifiedName(), new InnerClassMetaAttribute( metaEntity ) );
287271
}
288272

289273
public void setParentElement(TypeElement parentElement) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.hibernate.processor.model.MetaAttribute;
1212

1313
import javax.lang.model.element.AnnotationMirror;
14+
import javax.lang.model.element.Element;
1415
import javax.lang.model.element.PackageElement;
1516
import javax.tools.Diagnostic;
1617
import java.util.ArrayList;
@@ -69,7 +70,7 @@ public final String getQualifiedName() {
6970
}
7071

7172
@Override
72-
public @Nullable String getSupertypeName() {
73+
public @Nullable Element getSuperTypeElement() {
7374
return null;
7475
}
7576

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public String getAttributeDeclarationString() {
6666
final StringBuilder declaration = new StringBuilder();
6767
declaration
6868
.append('\n');
69-
if ( annotationMetaEntity.getSupertypeName() == null ) {
69+
if ( annotationMetaEntity.getSuperTypeElement() == null ) {
7070
declaration
7171
.append("@")
7272
.append(annotationMetaEntity.importType("jakarta.persistence.PersistenceUnit"));

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,16 @@
1111

1212
public class NonManagedMetamodel extends AnnotationMetaEntity {
1313

14-
public NonManagedMetamodel(TypeElement element, Context context, @Nullable AnnotationMeta parent) {
15-
super( element, context, false, false, parent );
14+
public NonManagedMetamodel(TypeElement element, Context context, boolean jakartaDataStaticMetamodel, @Nullable AnnotationMeta parent) {
15+
super( element, context, false, jakartaDataStaticMetamodel, parent );
1616
}
1717

1818
public static NonManagedMetamodel create(
1919
TypeElement element, Context context,
20+
boolean jakartaDataStaticMetamodel,
2021
@Nullable AnnotationMetaEntity parent) {
2122
final NonManagedMetamodel metamodel =
22-
new NonManagedMetamodel( element, context, parent );
23+
new NonManagedMetamodel( element, context, jakartaDataStaticMetamodel, parent );
2324
if ( parent != null ) {
2425
metamodel.setParentElement( parent.getElement() );
2526
parent.addInnerClass( metamodel );

0 commit comments

Comments
 (0)