Skip to content

Commit c9b6986

Browse files
committed
implement support for Jakarta Data events
(no events for reactive repos)
1 parent 48a2d91 commit c9b6986

File tree

6 files changed

+107
-23
lines changed

6 files changed

+107
-23
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@ 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+
111117
final List<MetaAttribute> members = entity.getMembers();
112118
for ( MetaAttribute metaMember : members ) {
113119
if ( metaMember instanceof InnerClassMetaAttribute innerClass ) {

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
@@ -92,6 +92,7 @@ public final class Context {
9292
private AccessType persistenceUnitDefaultAccessType;
9393
private boolean generateJakartaDataStaticMetamodel;
9494
private boolean quarkusInjection;
95+
private boolean dataEventPackageAvailable;
9596

9697
// keep track of all classes for which model have been generated
9798
private final Set<Metamodel> generatedModelClasses = new HashSet<>();
@@ -224,6 +225,14 @@ public void setQuarkusInjection(boolean quarkusInjection) {
224225
this.quarkusInjection = quarkusInjection;
225226
}
226227

228+
public boolean isDataEventPackageAvailable() {
229+
return dataEventPackageAvailable;
230+
}
231+
232+
public void setDataEventPackageAvailable(boolean dataEventPackageAvailable) {
233+
this.dataEventPackageAvailable = dataEventPackageAvailable;
234+
}
235+
227236
public Elements getElementUtils() {
228237
return processingEnvironment.getElementUtils();
229238
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@ private boolean handleSettings(ProcessingEnvironment environment) {
243243
final PackageElement quarkusOrmPackage =
244244
context.getProcessingEnvironment().getElementUtils()
245245
.getPackageElement( "io.quarkus.hibernate.orm" );
246+
final PackageElement dataEventPackage =
247+
context.getProcessingEnvironment().getElementUtils()
248+
.getPackageElement( "jakarta.data.event" );
246249

247250
PackageElement quarkusOrmPanachePackage =
248251
context.getProcessingEnvironment().getElementUtils()
@@ -265,6 +268,7 @@ && packagePresent(quarkusOrmPanachePackage) ) {
265268
context.setAddGeneratedAnnotation( packagePresent(jakartaAnnotationPackage) );
266269
context.setAddDependentAnnotation( packagePresent(jakartaContextPackage) );
267270
context.setAddTransactionScopedAnnotation( packagePresent(jakartaTransactionsPackage) );
271+
context.setDataEventPackageAvailable( packagePresent(dataEventPackage) );
268272
context.setQuarkusInjection( packagePresent(quarkusOrmPackage) );
269273
context.setUsesQuarkusOrm( packagePresent(quarkusOrmPanachePackage) );
270274
context.setUsesQuarkusReactive( packagePresent(quarkusReactivePanachePackage) );

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,11 @@ boolean needsDefaultConstructor() {
685685
return null;
686686
}
687687

688+
@Override
689+
public boolean isReactive() {
690+
return usingReactiveSession(sessionType);
691+
}
692+
688693
private boolean isPanacheType(TypeElement type) {
689694
return context.usesQuarkusOrm() && isOrmPanacheType( type )
690695
|| context.usesQuarkusReactive() && isReactivePanacheType( type );

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

Lines changed: 79 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
import javax.lang.model.element.ExecutableElement;
99

10+
import java.util.Set;
11+
12+
import static java.lang.Character.toUpperCase;
1013
import static org.hibernate.processor.util.Constants.LIST;
1114
import static org.hibernate.processor.util.Constants.UNI;
1215

@@ -60,32 +63,102 @@ public boolean hasStringAttribute() {
6063
return false;
6164
}
6265

66+
private String capitalize(String string) {
67+
return toUpperCase(string.charAt(0)) + string.substring(1);
68+
}
69+
70+
static final Set<String> eventTypes = Set.of("insert", "update", "delete");
71+
6372
@Override
6473
public String getAttributeDeclarationString() {
6574
StringBuilder declaration = new StringBuilder();
6675
preamble(declaration);
6776
nullCheck(declaration, parameterName);
77+
preEvent(declaration);
6878
if ( !isReactive() ) {
6979
declaration.append( "\ttry {\n" );
7080
}
7181
delegateCall(declaration);
72-
returnArgument(declaration);
82+
returnArgumentReactively(declaration);
7383
if ( !isReactive() ) {
74-
if ( returnArgument ) {
75-
declaration
76-
.append( ";\n" );
77-
}
7884
declaration.append( "\t}\n" );
7985
}
8086
convertExceptions( declaration );
8187
if ( isReactive() ) {
8288
declaration
8389
.append( ";\n" );
8490
}
91+
postEvent(declaration);
92+
returnArgument(declaration);
8593
declaration.append("}");
8694
return declaration.toString();
8795
}
8896

97+
private void postEvent(StringBuilder declaration) {
98+
if ( annotationMetaEntity.getContext().isDataEventPackageAvailable()
99+
&& annotationMetaEntity.getContext().addDependentAnnotation()
100+
&& eventTypes.contains( operationName )
101+
&& !isReactive() ) {
102+
final String postEventType = "Post" + capitalize( operationName ) + "Event";
103+
annotationMetaEntity.importType( "jakarta.data.event." + postEventType );
104+
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" );
114+
}
115+
}
116+
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" );
128+
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( "<>(" )
136+
.append( parameterName )
137+
.append( "));\n" );
138+
}
139+
}
140+
141+
private void returnArgument(StringBuilder declaration) {
142+
if ( returnArgument && !isReactive() ) {
143+
declaration
144+
.append( "\treturn " )
145+
.append( parameterName )
146+
.append( ";\n" );
147+
}
148+
}
149+
150+
private void returnArgumentReactively(StringBuilder declaration) {
151+
if ( isReactive() ) {
152+
if ( returnArgument ) {
153+
declaration
154+
.append( "\n\t\t\t.replaceWith(")
155+
.append(parameterName)
156+
.append(")");
157+
}
158+
}
159+
}
160+
161+
89162
private void convertExceptions(StringBuilder declaration) {
90163
if ( operationName.equals("insert") ) {
91164
handle( declaration,
@@ -102,23 +175,6 @@ private void convertExceptions(StringBuilder declaration) {
102175
"jakarta.data.exceptions.DataException");
103176
}
104177

105-
private void returnArgument(StringBuilder declaration) {
106-
if ( returnArgument ) {
107-
if ( isReactive() ) {
108-
declaration
109-
.append( "\n\t\t\t" )
110-
.append(".replaceWith(")
111-
.append(parameterName)
112-
.append(")");
113-
}
114-
else {
115-
declaration
116-
.append("\t\treturn ")
117-
.append(parameterName);
118-
}
119-
}
120-
}
121-
122178
private void delegateCall(StringBuilder declaration) {
123179
if ( isReactive() ) {
124180
// TODO: handle the case of an iterable parameter
@@ -179,7 +235,7 @@ private void argument(StringBuilder declaration) {
179235
if ( isReactive() ) {
180236
declaration
181237
.append("All")
182-
.append("(")
238+
.append("((Object[]) ")
183239
.append(parameterName)
184240
.append(")");
185241
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,8 @@ public interface Metamodel extends ImportContext {
6060
List<AnnotationMirror> inheritedAnnotations();
6161

6262
String javadoc();
63+
64+
default boolean isReactive() {
65+
return false;
66+
}
6367
}

0 commit comments

Comments
 (0)