Skip to content

Commit 3b3bd5e

Browse files
committed
more work on data events
1 parent 24df225 commit 3b3bd5e

File tree

4 files changed

+154
-40
lines changed

4 files changed

+154
-40
lines changed

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,6 @@ private static StringBuffer generateBody(Metamodel entity, Context context) {
108108

109109
pw.println();
110110

111-
// TODO: move this!
112-
if ( context.addDependentAnnotation() && context.isDataEventPackageAvailable()
113-
&& entity.isImplementation() && !entity.isReactive() ) {
114-
pw.println("\t@Inject private Event<? super LifecycleEvent<?>> event;\n");
115-
}
116-
117111
final List<MetaAttribute> members = entity.getMembers();
118112
for ( MetaAttribute metaMember : members ) {
119113
if ( metaMember instanceof InnerClassMetaAttribute innerClass ) {

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,9 +637,24 @@ else if ( element.getKind() == ElementKind.INTERFACE
637637
if ( needsDefaultConstructor() ) {
638638
addDefaultConstructor();
639639
}
640+
if ( needsEventBus() ) {
641+
addEventBus();
642+
}
640643
}
641644
}
642645

646+
private boolean needsEventBus() {
647+
return jakartaDataRepository
648+
&& !usingReactiveSession( sessionType ) // non-reactive
649+
&& context.isDataEventPackageAvailable() // events
650+
&& context.addInjectAnnotation() // @nject
651+
&& context.addDependentAnnotation(); // CDI
652+
}
653+
654+
void addEventBus() {
655+
putMember("_event", new EventField(this) );
656+
}
657+
643658
/**
644659
* For usage with CDI, but outside Quarkus, Jakarta Data
645660
* repositories use {@code @PersistenceUnit} to obtain an
@@ -1382,6 +1397,7 @@ else if ( returnArgument
13821397
new LifecycleMethod(
13831398
this, method,
13841399
entity,
1400+
typeAsString(lifecycleParameterArgument(parameterType)),
13851401
methodName,
13861402
parameter.getSimpleName().toString(),
13871403
getSessionVariableName(),
@@ -1424,6 +1440,23 @@ private static LifecycleMethod.ParameterKind lifecycleParameterKind(TypeMirror p
14241440
}
14251441
}
14261442

1443+
private TypeMirror lifecycleParameterArgument(TypeMirror parameterType) {
1444+
switch (parameterType.getKind()) {
1445+
case ARRAY:
1446+
final ArrayType arrayType = (ArrayType) parameterType;
1447+
return arrayType.getComponentType();
1448+
case DECLARED:
1449+
final DeclaredType declaredType = (DeclaredType) parameterType;
1450+
final TypeElement typeElement = (TypeElement) declaredType.asElement();
1451+
return typeElement.getQualifiedName().contentEquals(LIST)
1452+
&& !declaredType.getTypeArguments().isEmpty()
1453+
? declaredType.getTypeArguments().get(0)
1454+
: context.getElementUtils().getTypeElement(JAVA_OBJECT).asType();
1455+
default:
1456+
return parameterType;
1457+
}
1458+
}
1459+
14271460
private static boolean isVoid(TypeMirror returnType) {
14281461
switch (returnType.getKind()) {
14291462
case VOID:
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.processor.annotation;
6+
7+
import org.hibernate.processor.model.MetaAttribute;
8+
import org.hibernate.processor.model.Metamodel;
9+
import org.hibernate.processor.util.Constants;
10+
11+
12+
/**
13+
* Used by the container to instantiate a Jakarta Data repository.
14+
*
15+
* @author Gavin King
16+
*/
17+
public class EventField implements MetaAttribute {
18+
19+
private final AnnotationMetaEntity annotationMetaEntity;
20+
21+
public EventField(AnnotationMetaEntity annotationMetaEntity) {
22+
this.annotationMetaEntity = annotationMetaEntity;
23+
}
24+
25+
@Override
26+
public boolean hasTypedAttribute() {
27+
return true;
28+
}
29+
30+
@Override
31+
public boolean hasStringAttribute() {
32+
return false;
33+
}
34+
35+
@Override
36+
public String getAttributeDeclarationString() {
37+
annotationMetaEntity.importType("jakarta.inject.Inject");
38+
annotationMetaEntity.importType("jakarta.data.event.LifecycleEvent");
39+
return "\n@Inject\nprivate Event<? super LifecycleEvent<?>> event;";
40+
}
41+
42+
@Override
43+
public String getAttributeNameDeclarationString() {
44+
throw new UnsupportedOperationException("operation not supported");
45+
}
46+
47+
@Override
48+
public String getMetaType() {
49+
throw new UnsupportedOperationException("operation not supported");
50+
}
51+
52+
@Override
53+
public String getPropertyName() {
54+
return "event";
55+
}
56+
57+
@Override
58+
public String getTypeDeclaration() {
59+
return Constants.ENTITY_MANAGER;
60+
}
61+
62+
@Override
63+
public Metamodel getHostingEntity() {
64+
return annotationMetaEntity;
65+
}
66+
}

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

Lines changed: 55 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
public class LifecycleMethod extends AbstractAnnotatedMethod {
1717
private final String entity;
18+
private final String actualEntity;
1819
private final String methodName;
1920
private final String parameterName;
2021
private final String operationName;
@@ -33,6 +34,7 @@ public LifecycleMethod(
3334
AnnotationMetaEntity annotationMetaEntity,
3435
ExecutableElement method,
3536
String entity,
37+
String actualEntity,
3638
String methodName,
3739
String parameterName,
3840
String sessionName,
@@ -44,6 +46,7 @@ public LifecycleMethod(
4446
boolean hasGeneratedId) {
4547
super(annotationMetaEntity, method, sessionName, sessionType);
4648
this.entity = entity;
49+
this.actualEntity = actualEntity;
4750
this.methodName = methodName;
4851
this.parameterName = parameterName;
4952
this.operationName = operationName;
@@ -74,7 +77,7 @@ public String getAttributeDeclarationString() {
7477
StringBuilder declaration = new StringBuilder();
7578
preamble(declaration);
7679
nullCheck(declaration, parameterName);
77-
preEvent(declaration);
80+
fireEvents(declaration, "Pre");
7881
if ( !isReactive() ) {
7982
declaration.append( "\ttry {\n" );
8083
}
@@ -88,53 +91,71 @@ public String getAttributeDeclarationString() {
8891
declaration
8992
.append( ";\n" );
9093
}
91-
postEvent(declaration);
94+
fireEvents(declaration, "Post");
9295
returnArgument(declaration);
9396
declaration.append("}");
9497
return declaration.toString();
9598
}
9699

97-
private void postEvent(StringBuilder declaration) {
100+
private void fireEvents(StringBuilder declaration, String prefix) {
98101
if ( annotationMetaEntity.getContext().isDataEventPackageAvailable()
99102
&& annotationMetaEntity.getContext().addDependentAnnotation()
100103
&& eventTypes.contains( operationName )
101-
&& !isReactive() ) {
102-
final String postEventType = "Post" + capitalize( operationName ) + "Event";
103-
annotationMetaEntity.importType( "jakarta.data.event." + postEventType );
104+
&& !isReactive()) {
105+
final String entityName = iterateEvents( declaration );
106+
fireEvent( declaration, entityName, prefix + capitalize( operationName ) + "Event" );
107+
endIterateEvents( declaration );
108+
}
109+
}
110+
111+
private void fireEvent(StringBuilder declaration, String entityName, String eventType) {
112+
annotationMetaEntity.importType( "jakarta.data.event.LifecycleEvent" );
113+
annotationMetaEntity.importType( "jakarta.enterprise.util.TypeLiteral" );
114+
annotationMetaEntity.importType( "jakarta.enterprise.event.Event" );
115+
annotationMetaEntity.importType( "jakarta.inject.Inject" );
116+
annotationMetaEntity.importType( "jakarta.data.event." + eventType );
117+
if (parameterKind != ParameterKind.NORMAL) {
118+
declaration.append( "\t" );
119+
}
120+
declaration
121+
.append( "\tif (event != null) {\n" );
122+
if (parameterKind != ParameterKind.NORMAL) {
123+
declaration.append( "\t" );
124+
}
125+
declaration
126+
.append( "\t\tevent.select(new TypeLiteral<" )
127+
.append( eventType )
128+
.append( "<" )
129+
.append( annotationMetaEntity.importType( actualEntity ) )
130+
.append( ">>(){})\n\t\t\t\t.fire(new " )
131+
.append( eventType )
132+
.append( "<>(" )
133+
.append( entityName )
134+
.append( "));\n");
135+
if (parameterKind != ParameterKind.NORMAL) {
136+
declaration.append( "\t" );
137+
}
138+
declaration
139+
.append("\t}\n" );
140+
}
141+
142+
private void endIterateEvents(StringBuilder declaration) {
143+
if (parameterKind != ParameterKind.NORMAL) {
104144
declaration
105-
.append( "\tevent.select(new TypeLiteral<" )
106-
.append( postEventType )
107-
.append( "<" )
108-
.append( annotationMetaEntity.importType( entity ) )
109-
.append( ">>(){})\n\t\t\t.fire(new " )
110-
.append( postEventType )
111-
.append( "<>(" )
112-
.append( parameterName )
113-
.append( "));\n" );
145+
.append( "\t}\n");
114146
}
115147
}
116148

117-
private void preEvent(StringBuilder declaration) {
118-
if ( annotationMetaEntity.getContext().isDataEventPackageAvailable()
119-
&& annotationMetaEntity.getContext().addDependentAnnotation()
120-
&& eventTypes.contains( operationName )
121-
&& !isReactive()) {
122-
final String preEventType = "Pre" + capitalize( operationName ) + "Event";
123-
annotationMetaEntity.importType( "jakarta.data.event." + preEventType );
124-
annotationMetaEntity.importType( "jakarta.data.event.LifecycleEvent" );
125-
annotationMetaEntity.importType( "jakarta.enterprise.util.TypeLiteral" );
126-
annotationMetaEntity.importType( "jakarta.enterprise.event.Event" );
127-
annotationMetaEntity.importType( "jakarta.inject.Inject" );
149+
private String iterateEvents(StringBuilder declaration) {
150+
if (parameterKind != ParameterKind.NORMAL) {
128151
declaration
129-
.append( "\tevent.select(new TypeLiteral<" )
130-
.append( preEventType )
131-
.append( "<" )
132-
.append( annotationMetaEntity.importType( entity ) )
133-
.append( ">>(){})\n\t\t\t.fire(new " )
134-
.append( preEventType )
135-
.append( "<>(" )
152+
.append( "\tfor (var _entity : ")
136153
.append( parameterName )
137-
.append( "));\n" );
154+
.append(") {\n" );
155+
return "_entity";
156+
}
157+
else {
158+
return parameterName;
138159
}
139160
}
140161

0 commit comments

Comments
 (0)