Skip to content

Commit 5a00177

Browse files
committed
clean up logging related to bytecode enhancement
1 parent 5cca19a commit 5a00177

File tree

8 files changed

+157
-91
lines changed

8 files changed

+157
-91
lines changed

hibernate-core/src/main/java/org/hibernate/bytecode/BytecodeLogging.java

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.bytecode.enhance.internal;
6+
7+
import org.hibernate.Internal;
8+
import org.hibernate.internal.log.SubSystemLogging;
9+
import org.jboss.logging.BasicLogger;
10+
import org.jboss.logging.Logger;
11+
import org.jboss.logging.annotations.LogMessage;
12+
import org.jboss.logging.annotations.Message;
13+
import org.jboss.logging.annotations.MessageLogger;
14+
import org.jboss.logging.annotations.ValidIdRange;
15+
16+
import java.lang.invoke.MethodHandles;
17+
18+
import static org.jboss.logging.Logger.Level.DEBUG;
19+
import static org.jboss.logging.Logger.Level.INFO;
20+
import static org.jboss.logging.Logger.Level.TRACE;
21+
22+
23+
/**
24+
* @author Steve Ebersole
25+
*/
26+
@MessageLogger(projectCode = "HHH")
27+
@ValidIdRange(min = 90005801, max = 90005900)
28+
@SubSystemLogging(
29+
name = BytecodeEnhancementLogging.LOGGER_NAME,
30+
description = "Logging related to bytecode handling"
31+
)
32+
@Internal
33+
public interface BytecodeEnhancementLogging extends BasicLogger {
34+
String LOGGER_NAME = SubSystemLogging.BASE + ".bytecode.enhancement";
35+
BytecodeEnhancementLogging LOGGER = Logger.getMessageLogger( MethodHandles.lookup(), BytecodeEnhancementLogging.class, LOGGER_NAME );
36+
37+
// ---- trace messages ----
38+
@LogMessage(level = TRACE)
39+
@Message(id = 90005801, value = "Skipping enhancement of [%s]: it's already annotated with @EnhancementInfo")
40+
void skippingAlreadyAnnotated(String className);
41+
42+
@LogMessage(level = TRACE)
43+
@Message(id = 90005802, value = "Skipping enhancement of [%s]: it's an interface")
44+
void skippingInterface(String className);
45+
46+
@LogMessage(level = TRACE)
47+
@Message(id = 90005803, value = "Skipping enhancement of [%s]: it's a record")
48+
void skippingRecord(String className);
49+
50+
@LogMessage(level = TRACE)
51+
@Message(id = 90005804, value = "Enhancing [%s] as Entity")
52+
void enhancingAsEntity(String className);
53+
54+
@LogMessage(level = TRACE)
55+
@Message(id = 90005805, value = "Enhancing [%s] as Composite")
56+
void enhancingAsComposite(String className);
57+
58+
@LogMessage(level = TRACE)
59+
@Message(id = 90005806, value = "Enhancing [%s] as MappedSuperclass")
60+
void enhancingAsMappedSuperclass(String className);
61+
62+
@LogMessage(level = TRACE)
63+
@Message(id = 90005807, value = "Extended enhancement of [%s]")
64+
void extendedEnhancement(String className);
65+
66+
@LogMessage(level = TRACE)
67+
@Message(id = 90005808, value = "Skipping enhancement of [%s]: not entity or composite")
68+
void skippingNotEntityOrComposite(String className);
69+
70+
@LogMessage(level = TRACE)
71+
@Message(id = 90005809, value = "Weaving in PersistentAttributeInterceptable implementation on [%s]")
72+
void weavingPersistentAttributeInterceptable(String className);
73+
74+
@LogMessage(level = TRACE)
75+
@Message(id = 90005810, value = "mappedBy association for field [%s.%s] is [%s.%s]")
76+
void mappedByAssociation(String ownerName, String fieldName, String targetEntityName, String targetFieldName);
77+
78+
@LogMessage(level = TRACE)
79+
@Message(id = 90005811, value = "Persistent fields for entity %s: %s")
80+
void persistentFieldsForEntity(String entityName, String orderedFields);
81+
82+
@LogMessage(level = TRACE)
83+
@Message(id = 90005812, value = "Found @MappedSuperclass '%s' to collectPersistenceFields")
84+
void foundMappedSuperclass(String superClassName);
85+
86+
@LogMessage(level = TRACE)
87+
@Message(id = 90005813, value = "Extended enhancement: Transforming access to field [%s.%s] from method [%s.%s()]")
88+
void extendedTransformingFieldAccess(String ownerType, String fieldName, String methodOwner, String methodName);
89+
90+
// ---- debug messages ----
91+
@LogMessage(level = DEBUG)
92+
@Message(id = 90005820, value = "Skipping re-enhancement version check for '%s' due to 'ignore'")
93+
void skippingReEnhancementVersionCheck(String className);
94+
95+
@LogMessage(level = DEBUG)
96+
@Message(id = 90005821, value = "Skipping enhancement of [%s] because no field named [%s] could be found for property accessor method [%s]."
97+
+ " To fix this, make sure all property accessor methods have a matching field.")
98+
void propertyAccessorNoFieldSkip(String className, String fieldName, String methodName);
99+
100+
// ---- info messages ----
101+
@LogMessage(level = INFO)
102+
@Message(id = 90005830, value = "Bidirectional association not managed for field [%s.%s]: Could not find target field in [%s]")
103+
void bidirectionalNotManagedCouldNotFindTargetField(String ownerName, String fieldName, String targetEntityCanonicalName);
104+
105+
@LogMessage(level = INFO)
106+
@Message(id = 90005831, value = "Bidirectional association not managed for field [%s.%s]: @ManyToMany in java.util.Map attribute not supported ")
107+
void manyToManyInMapNotSupported(String ownerName, String fieldName);
108+
109+
@LogMessage(level = INFO)
110+
@Message(id = 90005832, value = "Bidirectional association not managed for field [%s.%s]: Could not find target type")
111+
void bidirectionalNotManagedCouldNotFindTargetType(String ownerName, String fieldName);
112+
}

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/BiDirectionalAssociationHandler.java

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020
import org.hibernate.bytecode.enhance.internal.bytebuddy.EnhancerImpl.AnnotatedFieldDescription;
2121
import org.hibernate.bytecode.enhance.spi.EnhancementException;
2222
import org.hibernate.bytecode.enhance.spi.EnhancerConstants;
23-
import org.hibernate.internal.CoreLogging;
24-
import org.hibernate.internal.CoreMessageLogger;
23+
import org.hibernate.bytecode.enhance.internal.BytecodeEnhancementLogging;
2524

2625
import net.bytebuddy.asm.Advice;
2726
import net.bytebuddy.description.annotation.AnnotationDescription;
@@ -40,8 +39,6 @@
4039

4140
final class BiDirectionalAssociationHandler implements Implementation {
4241

43-
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( BiDirectionalAssociationHandler.class );
44-
4542
static Implementation wrap(
4643
TypeDescription managedCtClass,
4744
ByteBuddyEnhancementContext enhancementContext,
@@ -64,9 +61,8 @@ static Implementation wrap(
6461
bidirectionalAttributeName = mappedBy;
6562
}
6663
if ( bidirectionalAttributeName == null || bidirectionalAttributeName.isEmpty() ) {
67-
if ( LOG.isInfoEnabled() ) {
68-
LOG.infof(
69-
"Bidirectional association not managed for field [%s#%s]: Could not find target field in [%s]",
64+
if ( BytecodeEnhancementLogging.LOGGER.isInfoEnabled() ) {
65+
BytecodeEnhancementLogging.LOGGER.bidirectionalNotManagedCouldNotFindTargetField(
7066
managedCtClass.getName(),
7167
persistentField.getName(),
7268
targetEntity.getCanonicalName()
@@ -120,9 +116,8 @@ static Implementation wrap(
120116
if ( persistentField.hasAnnotation( ManyToMany.class ) ) {
121117

122118
if ( persistentField.getType().asErasure().isAssignableTo( Map.class ) || targetType.isAssignableTo( Map.class ) ) {
123-
if ( LOG.isInfoEnabled() ) {
124-
LOG.infof(
125-
"Bidirectional association not managed for field [%s#%s]: @ManyToMany in java.util.Map attribute not supported ",
119+
if ( BytecodeEnhancementLogging.LOGGER.isInfoEnabled() ) {
120+
BytecodeEnhancementLogging.LOGGER.manyToManyInMapNotSupported(
126121
managedCtClass.getName(),
127122
persistentField.getName()
128123
);
@@ -148,35 +143,29 @@ public static TypeDescription getTargetEntityClass(TypeDescription managedCtClas
148143
AnnotationDescription.Loadable<ManyToOne> mto = persistentField.getAnnotation( ManyToOne.class );
149144
AnnotationDescription.Loadable<ManyToMany> mtm = persistentField.getAnnotation( ManyToMany.class );
150145

151-
if ( oto == null && otm == null && mto == null && mtm == null ) {
152-
return null;
153-
}
154-
155-
AnnotationValue<?, ?> targetClass = null;
146+
final AnnotationValue<?, ?> targetClass;
156147
if ( oto != null ) {
157148
targetClass = oto.getValue( new MethodDescription.ForLoadedMethod( OneToOne.class.getDeclaredMethod( "targetEntity" ) ) );
158149
}
159-
if ( otm != null ) {
150+
else if ( otm != null ) {
160151
targetClass = otm.getValue( new MethodDescription.ForLoadedMethod( OneToMany.class.getDeclaredMethod( "targetEntity" ) ) );
161152
}
162-
if ( mto != null ) {
153+
else if ( mto != null ) {
163154
targetClass = mto.getValue( new MethodDescription.ForLoadedMethod( ManyToOne.class.getDeclaredMethod( "targetEntity" ) ) );
164155
}
165-
if ( mtm != null ) {
156+
else if ( mtm != null ) {
166157
targetClass = mtm.getValue( new MethodDescription.ForLoadedMethod( ManyToMany.class.getDeclaredMethod( "targetEntity" ) ) );
167158
}
168-
169-
if ( targetClass == null ) {
170-
if ( LOG.isInfoEnabled() ) {
171-
LOG.infof(
172-
"Bidirectional association not managed for field [%s#%s]: Could not find target type",
159+
else {
160+
if ( BytecodeEnhancementLogging.LOGGER.isInfoEnabled() ) {
161+
BytecodeEnhancementLogging.LOGGER.bidirectionalNotManagedCouldNotFindTargetType(
173162
managedCtClass.getName(),
174163
persistentField.getName()
175164
);
176165
}
177166
return null;
178167
}
179-
else if ( !targetClass.resolve( TypeDescription.class ).represents( void.class ) ) {
168+
if ( !targetClass.resolve( TypeDescription.class ).represents( void.class ) ) {
180169
return targetClass.resolve( TypeDescription.class );
181170
}
182171
}
@@ -253,8 +242,8 @@ private static String getMappedByManyToMany(AnnotatedFieldDescription target, Ty
253242
if ( context.isPersistentField( annotatedF )
254243
&& target.getName().equals( getMappedBy( annotatedF, entityType( annotatedF.getType() ), context ) )
255244
&& target.getDeclaringType().asErasure().isAssignableTo( entityType( annotatedF.getType() ) ) ) {
256-
if ( LOG.isTraceEnabled() ) {
257-
LOG.tracef(
245+
if ( BytecodeEnhancementLogging.LOGGER.isTraceEnabled() ) {
246+
BytecodeEnhancementLogging.LOGGER.tracef(
258247
"mappedBy association for field [%s#%s] is [%s#%s]",
259248
target.getDeclaringType().asErasure().getName(),
260249
target.getName(),

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/EnhancerImpl.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@
4545
import org.hibernate.engine.spi.CompositeOwner;
4646
import org.hibernate.engine.spi.ExtendedSelfDirtinessTracker;
4747
import org.hibernate.engine.spi.Managed;
48-
import org.hibernate.internal.CoreLogging;
49-
import org.hibernate.internal.CoreMessageLogger;
48+
import org.hibernate.bytecode.enhance.internal.BytecodeEnhancementLogging;
5049

5150
import java.lang.annotation.Annotation;
5251
import java.lang.reflect.Modifier;
@@ -69,7 +68,6 @@
6968
import static org.hibernate.bytecode.enhance.internal.bytebuddy.FeatureMismatchException.Feature.DIRTY_CHECK;
7069

7170
public class EnhancerImpl implements Enhancer {
72-
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( Enhancer.class );
7371

7472
protected final ByteBuddyEnhancementContext enhancementContext;
7573
private final ByteBuddyState byteBuddyState;
@@ -172,19 +170,19 @@ private DynamicType.Builder<?> doEnhance(Supplier<DynamicType.Builder<?>> builde
172170
verifyReEnhancement( managedCtClass, infoAnnotation.load(), enhancementContext );
173171
}
174172
// verification succeeded (or not done) - we can simply skip the enhancement
175-
LOG.tracef( "Skipping enhancement of [%s]: it's already annotated with @EnhancementInfo", managedCtClass.getName() );
173+
BytecodeEnhancementLogging.LOGGER.skippingAlreadyAnnotated( managedCtClass.getName() );
176174
return null;
177175
}
178176

179177
// can't effectively enhance interfaces
180178
if ( managedCtClass.isInterface() ) {
181-
LOG.tracef( "Skipping enhancement of [%s]: it's an interface", managedCtClass.getName() );
179+
BytecodeEnhancementLogging.LOGGER.skippingInterface( managedCtClass.getName() );
182180
return null;
183181
}
184182

185183
// can't effectively enhance records
186184
if ( managedCtClass.isRecord() ) {
187-
LOG.tracef( "Skipping enhancement of [%s]: it's a record", managedCtClass.getName() );
185+
BytecodeEnhancementLogging.LOGGER.skippingRecord( managedCtClass.getName() );
188186
return null;
189187
}
190188

@@ -194,7 +192,7 @@ private DynamicType.Builder<?> doEnhance(Supplier<DynamicType.Builder<?>> builde
194192
return null;
195193
}
196194

197-
LOG.tracef( "Enhancing [%s] as Entity", managedCtClass.getName() );
195+
BytecodeEnhancementLogging.LOGGER.enhancingAsEntity( managedCtClass.getName() );
198196
DynamicType.Builder<?> builder = builderSupplier.get();
199197
builder = builder
200198
.implement( constants.INTERFACES_for_ManagedEntity )
@@ -374,7 +372,7 @@ else if ( enhancementContext.isCompositeClass( managedCtClass ) ) {
374372
return null;
375373
}
376374

377-
LOG.tracef( "Enhancing [%s] as Composite", managedCtClass.getName() );
375+
BytecodeEnhancementLogging.LOGGER.enhancingAsComposite( managedCtClass.getName() );
378376

379377
DynamicType.Builder<?> builder = builderSupplier.get();
380378
builder = builder.implement( constants.INTERFACES_for_ManagedComposite );
@@ -412,18 +410,18 @@ else if ( enhancementContext.isMappedSuperclassClass( managedCtClass ) ) {
412410
return null;
413411
}
414412

415-
LOG.tracef( "Enhancing [%s] as MappedSuperclass", managedCtClass.getName() );
413+
BytecodeEnhancementLogging.LOGGER.enhancingAsMappedSuperclass( managedCtClass.getName() );
416414

417415
DynamicType.Builder<?> builder = builderSupplier.get();
418416
builder = builder.implement( constants.INTERFACES_for_ManagedMappedSuperclass );
419417
return createTransformer( managedCtClass ).applyTo( builder );
420418
}
421419
else if ( enhancementContext.doExtendedEnhancement() ) {
422-
LOG.tracef( "Extended enhancement of [%s]", managedCtClass.getName() );
420+
BytecodeEnhancementLogging.LOGGER.extendedEnhancement( managedCtClass.getName() );
423421
return createTransformer( managedCtClass ).applyExtended( builderSupplier.get() );
424422
}
425423
else {
426-
LOG.tracef( "Skipping enhancement of [%s]: not entity or composite", managedCtClass.getName() );
424+
BytecodeEnhancementLogging.LOGGER.skippingNotEntityOrComposite( managedCtClass.getName() );
427425
return null;
428426
}
429427
}
@@ -436,7 +434,7 @@ private void verifyReEnhancement(
436434
final String enhancementVersion = existingInfo.version();
437435
if ( "ignore".equals( enhancementVersion ) ) {
438436
// for testing
439-
LOG.debugf( "Skipping re-enhancement version check for %s due to `ignore`", managedCtClass.getName() );
437+
BytecodeEnhancementLogging.LOGGER.skippingReEnhancementVersionCheck( managedCtClass.getName() );
440438
}
441439
else if ( !Version.getVersionString().equals( enhancementVersion ) ) {
442440
throw new VersionMismatchException( managedCtClass, enhancementVersion, Version.getVersionString() );
@@ -607,9 +605,7 @@ private static boolean checkUnsupportedAttributeNaming(TypeDescription managedCt
607605
// We shouldn't even be in this method if using LEGACY, see top of this method.
608606
return switch ( strategy ) {
609607
case SKIP -> {
610-
LOG.debugf(
611-
"Skipping enhancement of [%s] because no field named [%s] could be found for property accessor method [%s]."
612-
+ " To fix this, make sure all property accessor methods have a matching field.",
608+
BytecodeEnhancementLogging.LOGGER.propertyAccessorNoFieldSkip(
613609
managedCtClass.getName(),
614610
fieldName,
615611
methodDescription.getName()
@@ -666,7 +662,7 @@ private boolean alreadyEnhanced(TypeDescription managedCtClass) {
666662
private DynamicType.Builder<?> addInterceptorHandling(DynamicType.Builder<?> builder, TypeDescription managedCtClass) {
667663
// interceptor handling is only needed if class has lazy-loadable attributes
668664
if ( enhancementContext.hasLazyLoadableAttributes( managedCtClass ) ) {
669-
LOG.tracef( "Weaving in PersistentAttributeInterceptable implementation on [%s]", managedCtClass.getName() );
665+
BytecodeEnhancementLogging.LOGGER.weavingPersistentAttributeInterceptable( managedCtClass.getName() );
670666

671667
builder = builder.implement( constants.INTERFACES_for_PersistentAttributeInterceptable );
672668

hibernate-core/src/main/java/org/hibernate/bytecode/enhance/internal/bytebuddy/FieldAccessEnhancer.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616
import org.hibernate.bytecode.enhance.internal.bytebuddy.EnhancerImpl.AnnotatedFieldDescription;
1717
import org.hibernate.bytecode.enhance.spi.EnhancementException;
1818
import org.hibernate.bytecode.enhance.spi.EnhancerConstants;
19-
import org.hibernate.internal.CoreLogging;
20-
import org.hibernate.internal.CoreMessageLogger;
19+
import org.hibernate.bytecode.enhance.internal.BytecodeEnhancementLogging;
2120

2221
import net.bytebuddy.asm.AsmVisitorWrapper;
2322
import net.bytebuddy.description.field.FieldList;
@@ -33,8 +32,6 @@
3332

3433
final class FieldAccessEnhancer implements AsmVisitorWrapper.ForDeclaredMethods.MethodVisitorWrapper {
3534

36-
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( FieldAccessEnhancer.class );
37-
3835
private final TypeDescription managedCtClass;
3936

4037
private final ByteBuddyEnhancementContext enhancementContext;
@@ -76,8 +73,7 @@ public void visitFieldInsn(int opcode, String owner, String name, String desc) {
7673
&& !field.hasAnnotation( Id.class )
7774
&& !field.getName().equals( "this$0" ) ) {
7875

79-
LOG.tracef(
80-
"Extended enhancement: Transforming access to field [%s#%s] from method [%s#%s()]",
76+
BytecodeEnhancementLogging.LOGGER.extendedTransformingFieldAccess(
8177
declaredOwnerType.getName(),
8278
field.getName(),
8379
instrumentedType.getName(),

0 commit comments

Comments
 (0)