Skip to content

Commit 9d59cbc

Browse files
committed
#109 - Allow model to be loaded into a specific ClassLoader
1 parent ed4ad4b commit 9d59cbc

23 files changed

+448
-66
lines changed

hibernate-models-jandex/src/main/java/org/hibernate/models/jandex/internal/JandexClassDetails.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@
88
import java.util.ArrayList;
99
import java.util.List;
1010

11+
import org.hibernate.models.DynamicClassException;
1112
import org.hibernate.models.internal.ClassDetailsSupport;
1213
import org.hibernate.models.internal.jdk.SerialJdkClassDetails;
1314
import org.hibernate.models.internal.util.CollectionHelper;
1415
import org.hibernate.models.serial.spi.SerialClassDetails;
1516
import org.hibernate.models.spi.ClassDetails;
17+
import org.hibernate.models.spi.ClassLoading;
1618
import org.hibernate.models.spi.FieldDetails;
1719
import org.hibernate.models.spi.MethodDetails;
1820
import org.hibernate.models.spi.RecordComponentDetails;
1921
import org.hibernate.models.spi.SourceModelBuildingContext;
22+
import org.hibernate.models.spi.SourceModelContext;
2023
import org.hibernate.models.spi.TypeDetails;
2124
import org.hibernate.models.spi.TypeVariableDetails;
2225

@@ -212,16 +215,21 @@ public void addMethod(MethodDetails methodDetails) {
212215
@Override
213216
public <X> Class<X> toJavaClass() {
214217
if ( javaClass == null ) {
215-
if ( getClassName() == null ) {
216-
throw new UnsupportedOperationException( "Not supported" );
217-
}
218-
MODELS_CLASS_LOGGER.debugf( "Loading `%s` on to classloader from Jandex ClassDetails", getClassName() );
219-
javaClass = getModelContext().getClassLoading().classForName( getClassName() );
218+
javaClass = toJavaClass( getModelContext().getClassLoading(), getModelContext() );
220219
}
221220
//noinspection unchecked
222221
return (Class<X>) javaClass;
223222
}
224223

224+
@Override
225+
public <X> Class<X> toJavaClass(ClassLoading classLoading, SourceModelContext modelContext) {
226+
if ( getClassName() == null ) {
227+
throw new DynamicClassException( "ClassDetails (name=" + getName() + ") did not specify a class-name" );
228+
}
229+
MODELS_CLASS_LOGGER.debugf( "Loading `%s` on to classloader from Jandex ClassDetails", getClassName() );
230+
return classLoading.classForName( getClassName() );
231+
}
232+
225233
@Override
226234
public String toString() {
227235
return "JandexClassDetails(" + classInfo.name().toString() + ")";

hibernate-models-jandex/src/main/java/org/hibernate/models/jandex/internal/JandexFieldDetails.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,22 @@
66

77
import java.lang.annotation.Annotation;
88
import java.lang.reflect.Field;
9-
import java.lang.reflect.Member;
109
import java.util.Collection;
1110
import java.util.Map;
1211

1312
import org.hibernate.models.IllegalCastException;
13+
import org.hibernate.models.ModelsException;
1414
import org.hibernate.models.internal.AnnotationTargetSupport;
1515
import org.hibernate.models.spi.AnnotationDescriptor;
1616
import org.hibernate.models.spi.ClassDetails;
17+
import org.hibernate.models.spi.ClassLoading;
1718
import org.hibernate.models.spi.FieldDetails;
1819
import org.hibernate.models.spi.MethodDetails;
1920
import org.hibernate.models.spi.MutableClassDetails;
2021
import org.hibernate.models.spi.MutableMemberDetails;
2122
import org.hibernate.models.spi.RecordComponentDetails;
2223
import org.hibernate.models.spi.SourceModelBuildingContext;
24+
import org.hibernate.models.spi.SourceModelContext;
2325
import org.hibernate.models.spi.TypeDetails;
2426

2527
import org.jboss.jandex.AnnotationTarget;
@@ -86,25 +88,32 @@ public int getModifiers() {
8688
return fieldInfo.flags();
8789
}
8890

89-
private Member underlyingMember;
91+
private Field underlyingMember;
9092

9193
@Override
92-
public Member toJavaMember() {
94+
public Field toJavaMember() {
9395
if ( underlyingMember == null ) {
94-
underlyingMember = resolveJavaMember();
96+
final Class<?> declaringJavaClass = declaringType.toJavaClass();
97+
underlyingMember = resolveJavaMember( declaringJavaClass);
9598
}
9699
return underlyingMember;
97100
}
98101

99-
private Field resolveJavaMember() {
100-
final Class<?> declaringJavaClass = declaringType.toJavaClass();
102+
@Override
103+
public Field toJavaMember(Class<?> declaringClass, ClassLoading classLoading, SourceModelContext modelContext) {
104+
// make sure the type ends up on the given class-loading
105+
type.determineRawClass().toJavaClass( classLoading, modelContext );
106+
return resolveJavaMember( declaringClass );
107+
}
108+
109+
private Field resolveJavaMember(Class<?> declaringJavaClass) {
101110
try {
102111
return declaringJavaClass.getField( fieldInfo.name() );
103112
}
104113
catch (NoSuchFieldException e) {
105-
throw new RuntimeException(
114+
throw new ModelsException(
106115
String.format(
107-
"Jandex FieldInfo had no corresponding Field : %s.%s",
116+
"Unable to locate field `%s` on %s",
108117
declaringType.getName(),
109118
fieldInfo.name()
110119
),

hibernate-models-jandex/src/main/java/org/hibernate/models/jandex/internal/JandexMethodDetails.java

Lines changed: 25 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
import java.util.Map;
1414

1515
import org.hibernate.models.IllegalCastException;
16+
import org.hibernate.models.internal.util.ReflectionHelper;
1617
import org.hibernate.models.spi.AnnotationDescriptor;
18+
import org.hibernate.models.spi.ClassLoading;
1719
import org.hibernate.models.spi.FieldDetails;
1820
import org.hibernate.models.spi.MutableClassDetails;
1921
import org.hibernate.models.spi.MutableMemberDetails;
@@ -23,6 +25,7 @@
2325
import org.hibernate.models.spi.MethodDetails;
2426
import org.hibernate.models.spi.RecordComponentDetails;
2527
import org.hibernate.models.spi.SourceModelBuildingContext;
28+
import org.hibernate.models.spi.SourceModelContext;
2629
import org.hibernate.models.spi.TypeDetails;
2730
import org.hibernate.models.spi.TypeDetailsHelper;
2831
import org.hibernate.models.spi.TypeVariableScope;
@@ -126,16 +129,6 @@ public int getModifiers() {
126129
return methodInfo.flags();
127130
}
128131

129-
private Method underlyingMethod;
130-
131-
@Override
132-
public Method toJavaMember() {
133-
if ( underlyingMethod == null ) {
134-
underlyingMethod = resolveJavaMember();
135-
}
136-
return underlyingMethod;
137-
}
138-
139132
@Override
140133
public TypeDetails resolveRelativeType(TypeVariableScope container) {
141134
if ( methodKind == GETTER || methodKind == SETTER ) {
@@ -152,36 +145,31 @@ public ClassBasedTypeDetails resolveRelativeClassType(TypeVariableScope containe
152145
throw new IllegalStateException( "Method does not have a type - " + this );
153146
}
154147

155-
private Method resolveJavaMember() {
156-
final Class<?> declaringTypeClass = declaringType.toJavaClass();
157-
methods: for ( Method method : declaringTypeClass.getDeclaredMethods() ) {
158-
if ( !method.getName().equals( methodInfo.name() ) ) {
159-
continue;
160-
}
161-
162-
if ( method.getParameterCount() != methodInfo.parametersCount() ) {
163-
continue;
164-
}
165-
166-
for ( int i = 0; i < method.getParameterTypes().length; i++ ) {
167-
final Class<?> methodParameterType = method.getParameterTypes()[i];
168-
final Type expectedType = methodInfo.parameterType( i );
169-
if ( !methodParameterType.getName().equals( expectedType.name().toString() ) ) {
170-
continue methods;
171-
}
172-
}
148+
private Method underlyingMethod;
173149

174-
// if we get here, we've found it
175-
return method;
150+
@Override
151+
public Method toJavaMember() {
152+
if ( underlyingMethod == null ) {
153+
final Class<?> declaringClass = declaringType.toJavaClass();
154+
underlyingMethod = ReflectionHelper.resolveJavaMember(
155+
this,
156+
declaringClass,
157+
getModelContext().getClassLoading(),
158+
getModelContext()
159+
);
176160
}
161+
return underlyingMethod;
162+
}
177163

178-
throw new RuntimeException(
179-
String.format(
180-
"Jandex FieldInfo had no corresponding Field : %s.%s",
181-
declaringType.getName(),
182-
methodInfo.name()
183-
)
184-
); }
164+
@Override
165+
public Method toJavaMember(Class<?> declaringClass, ClassLoading classLoading, SourceModelContext modelContext) {
166+
return ReflectionHelper.resolveJavaMember(
167+
this,
168+
declaringClass,
169+
getModelContext().getClassLoading(),
170+
getModelContext()
171+
);
172+
}
185173

186174
@Override
187175
public ClassDetails getReturnType() {

hibernate-models-jandex/src/main/java/org/hibernate/models/jandex/internal/JandexRecordComponentDetails.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@
1212
import org.hibernate.models.IllegalCastException;
1313
import org.hibernate.models.spi.AnnotationDescriptor;
1414
import org.hibernate.models.spi.ClassDetails;
15+
import org.hibernate.models.spi.ClassLoading;
1516
import org.hibernate.models.spi.FieldDetails;
1617
import org.hibernate.models.spi.MethodDetails;
1718
import org.hibernate.models.spi.MutableClassDetails;
1819
import org.hibernate.models.spi.MutableMemberDetails;
1920
import org.hibernate.models.spi.RecordComponentDetails;
2021
import org.hibernate.models.spi.SourceModelBuildingContext;
22+
import org.hibernate.models.spi.SourceModelContext;
2123
import org.hibernate.models.spi.TypeDetails;
2224

2325
import org.jboss.jandex.AnnotationTarget;
@@ -89,6 +91,12 @@ public Member toJavaMember() {
8991
return null;
9092
}
9193

94+
@Override
95+
public Member toJavaMember(Class<?> declaringClass, ClassLoading classLoading, SourceModelContext modelContext) {
96+
// we could maybe resolve the corresponding method...
97+
return null;
98+
}
99+
92100
@Override
93101
public String toString() {
94102
return "JandexFieldDetails(" + getName() + ")";
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright: Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.models;
6+
7+
import org.hibernate.models.spi.ClassDetails;
8+
import org.hibernate.models.spi.ClassLoading;
9+
import org.hibernate.models.spi.SourceModelContext;
10+
11+
/**
12+
* Generally indicates an attempt to resolve a {@linkplain ClassDetails}
13+
* into the corresponding Java {@linkplain Class} when the ClassDetails does not
14+
* specify a {@linkplain ClassDetails#getClassName() class name}.
15+
*
16+
* @see ClassDetails#toJavaClass()
17+
* @see ClassDetails#toJavaClass(ClassLoading, SourceModelContext)
18+
*
19+
* @author Steve Ebersole
20+
*/
21+
public class DynamicClassException extends ModelsException {
22+
public DynamicClassException(String message) {
23+
super( message );
24+
}
25+
26+
public DynamicClassException(String message, Throwable cause) {
27+
super( message, cause );
28+
}
29+
}

hibernate-models/src/main/java/org/hibernate/models/internal/MissingPackageInfoDetails.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
import org.hibernate.models.serial.spi.SerialClassDetails;
1414
import org.hibernate.models.spi.AnnotationDescriptor;
1515
import org.hibernate.models.spi.ClassDetails;
16+
import org.hibernate.models.spi.ClassLoading;
1617
import org.hibernate.models.spi.FieldDetails;
1718
import org.hibernate.models.spi.MethodDetails;
1819
import org.hibernate.models.spi.RecordComponentDetails;
1920
import org.hibernate.models.spi.SourceModelBuildingContext;
21+
import org.hibernate.models.spi.SourceModelContext;
2022
import org.hibernate.models.spi.TypeDetails;
2123
import org.hibernate.models.spi.TypeVariableDetails;
2224

@@ -198,6 +200,11 @@ public <X> Class<X> toJavaClass() {
198200
throw new UnsupportedOperationException( "Missing package-info [" + packageInfoClassName + "] cannot be converted to a Java Class" );
199201
}
200202

203+
@Override
204+
public <X> Class<X> toJavaClass(ClassLoading classLoading, SourceModelContext modelContext) {
205+
return toJavaClass();
206+
}
207+
201208
@Override
202209
public SerialClassDetails toStorableForm() {
203210
return new SerialFormImpl( packageName, packageInfoClassName );

hibernate-models/src/main/java/org/hibernate/models/internal/SimpleClassDetails.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
import org.hibernate.models.serial.spi.SerialClassDetails;
1616
import org.hibernate.models.spi.AnnotationDescriptor;
1717
import org.hibernate.models.spi.ClassDetails;
18+
import org.hibernate.models.spi.ClassLoading;
1819
import org.hibernate.models.spi.FieldDetails;
1920
import org.hibernate.models.spi.MethodDetails;
2021
import org.hibernate.models.spi.RecordComponentDetails;
2122
import org.hibernate.models.spi.SourceModelBuildingContext;
23+
import org.hibernate.models.spi.SourceModelContext;
2224
import org.hibernate.models.spi.TypeDetails;
2325
import org.hibernate.models.spi.TypeVariableDetails;
2426

@@ -69,6 +71,11 @@ public <X> Class<X> toJavaClass() {
6971
return (Class<X>) clazz;
7072
}
7173

74+
@Override
75+
public <X> Class<X> toJavaClass(ClassLoading classLoading, SourceModelContext modelContext) {
76+
return classLoading.classForName( clazz.getName() );
77+
}
78+
7279
@Override
7380
public String toString() {
7481
return "ClassDetails(" + clazz.getName() + ")";

hibernate-models/src/main/java/org/hibernate/models/internal/SimpleClassLoading.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,6 @@ public <T> Class<T> findClassForName(String name) {
4545
}
4646
}
4747

48-
@Override
49-
public Package packageForName(String name) {
50-
return getClass().getClassLoader().getDefinedPackage( name );
51-
}
52-
5348
@Override
5449
public URL locateResource(String resourceName) {
5550
return getClass().getClassLoader().getResource( resourceName );

hibernate-models/src/main/java/org/hibernate/models/internal/dynamic/DynamicClassDetails.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,17 @@
88
import java.util.Collections;
99
import java.util.List;
1010

11+
import org.hibernate.models.DynamicClassException;
1112
import org.hibernate.models.internal.ClassDetailsSupport;
1213
import org.hibernate.models.internal.ClassTypeDetailsImpl;
1314
import org.hibernate.models.serial.spi.SerialClassDetails;
1415
import org.hibernate.models.spi.ClassDetails;
16+
import org.hibernate.models.spi.ClassLoading;
1517
import org.hibernate.models.spi.FieldDetails;
1618
import org.hibernate.models.spi.MethodDetails;
1719
import org.hibernate.models.spi.RecordComponentDetails;
1820
import org.hibernate.models.spi.SourceModelBuildingContext;
21+
import org.hibernate.models.spi.SourceModelContext;
1922
import org.hibernate.models.spi.TypeDetails;
2023
import org.hibernate.models.spi.TypeVariableDetails;
2124

@@ -221,10 +224,16 @@ public DynamicFieldDetails applyAttribute(
221224

222225
@Override
223226
public <X> Class<X> toJavaClass() {
227+
return toJavaClass( getModelContext().getClassLoading(), getModelContext() );
228+
}
229+
230+
@Override
231+
public <X> Class<X> toJavaClass(ClassLoading classLoading, SourceModelContext modelContext) {
224232
if ( javaType == null ) {
225-
if ( className != null ) {
226-
javaType = getModelContext().getClassLoading().classForName( className );
233+
if ( className == null ) {
234+
throw new DynamicClassException( "ClassDetails (name=" + name + ") did not specify a class-name" );
227235
}
236+
javaType = getModelContext().getClassLoading().classForName( className );
228237
}
229238
//noinspection unchecked
230239
return (Class<X>) javaType;

0 commit comments

Comments
 (0)