Skip to content

#109 - Allow model to be loaded into a specific ClassLoader #110

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,18 @@
import java.util.ArrayList;
import java.util.List;

import org.hibernate.models.DynamicClassException;
import org.hibernate.models.internal.ClassDetailsSupport;
import org.hibernate.models.internal.jdk.SerialJdkClassDetails;
import org.hibernate.models.internal.util.CollectionHelper;
import org.hibernate.models.serial.spi.SerialClassDetails;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassLoading;
import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MethodDetails;
import org.hibernate.models.spi.RecordComponentDetails;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;
import org.hibernate.models.spi.TypeDetails;
import org.hibernate.models.spi.TypeVariableDetails;

Expand Down Expand Up @@ -212,16 +215,21 @@ public void addMethod(MethodDetails methodDetails) {
@Override
public <X> Class<X> toJavaClass() {
if ( javaClass == null ) {
if ( getClassName() == null ) {
throw new UnsupportedOperationException( "Not supported" );
}
MODELS_CLASS_LOGGER.debugf( "Loading `%s` on to classloader from Jandex ClassDetails", getClassName() );
javaClass = getModelContext().getClassLoading().classForName( getClassName() );
javaClass = toJavaClass( getModelContext().getClassLoading(), getModelContext() );
}
//noinspection unchecked
return (Class<X>) javaClass;
}

@Override
public <X> Class<X> toJavaClass(ClassLoading classLoading, SourceModelContext modelContext) {
if ( getClassName() == null ) {
throw new DynamicClassException( "ClassDetails (name=" + getName() + ") did not specify a class-name" );
}
MODELS_CLASS_LOGGER.debugf( "Loading `%s` on to classloader from Jandex ClassDetails", getClassName() );
return classLoading.classForName( getClassName() );
}

@Override
public String toString() {
return "JandexClassDetails(" + classInfo.name().toString() + ")";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,22 @@

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.util.Collection;
import java.util.Map;

import org.hibernate.models.IllegalCastException;
import org.hibernate.models.ModelsException;
import org.hibernate.models.internal.AnnotationTargetSupport;
import org.hibernate.models.spi.AnnotationDescriptor;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassLoading;
import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MethodDetails;
import org.hibernate.models.spi.MutableClassDetails;
import org.hibernate.models.spi.MutableMemberDetails;
import org.hibernate.models.spi.RecordComponentDetails;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;
import org.hibernate.models.spi.TypeDetails;

import org.jboss.jandex.AnnotationTarget;
Expand Down Expand Up @@ -86,25 +88,32 @@ public int getModifiers() {
return fieldInfo.flags();
}

private Member underlyingMember;
private Field underlyingMember;

@Override
public Member toJavaMember() {
public Field toJavaMember() {
if ( underlyingMember == null ) {
underlyingMember = resolveJavaMember();
final Class<?> declaringJavaClass = declaringType.toJavaClass();
underlyingMember = resolveJavaMember( declaringJavaClass);
}
return underlyingMember;
}

private Field resolveJavaMember() {
final Class<?> declaringJavaClass = declaringType.toJavaClass();
@Override
public Field toJavaMember(Class<?> declaringClass, ClassLoading classLoading, SourceModelContext modelContext) {
// make sure the type ends up on the given class-loading
type.determineRawClass().toJavaClass( classLoading, modelContext );
return resolveJavaMember( declaringClass );
}

private Field resolveJavaMember(Class<?> declaringJavaClass) {
try {
return declaringJavaClass.getField( fieldInfo.name() );
}
catch (NoSuchFieldException e) {
throw new RuntimeException(
throw new ModelsException(
String.format(
"Jandex FieldInfo had no corresponding Field : %s.%s",
"Unable to locate field `%s` on %s",
declaringType.getName(),
fieldInfo.name()
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
import java.util.Map;

import org.hibernate.models.IllegalCastException;
import org.hibernate.models.internal.util.ReflectionHelper;
import org.hibernate.models.spi.AnnotationDescriptor;
import org.hibernate.models.spi.ClassLoading;
import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MutableClassDetails;
import org.hibernate.models.spi.MutableMemberDetails;
Expand All @@ -23,6 +25,7 @@
import org.hibernate.models.spi.MethodDetails;
import org.hibernate.models.spi.RecordComponentDetails;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;
import org.hibernate.models.spi.TypeDetails;
import org.hibernate.models.spi.TypeDetailsHelper;
import org.hibernate.models.spi.TypeVariableScope;
Expand Down Expand Up @@ -126,16 +129,6 @@ public int getModifiers() {
return methodInfo.flags();
}

private Method underlyingMethod;

@Override
public Method toJavaMember() {
if ( underlyingMethod == null ) {
underlyingMethod = resolveJavaMember();
}
return underlyingMethod;
}

@Override
public TypeDetails resolveRelativeType(TypeVariableScope container) {
if ( methodKind == GETTER || methodKind == SETTER ) {
Expand All @@ -152,36 +145,31 @@ public ClassBasedTypeDetails resolveRelativeClassType(TypeVariableScope containe
throw new IllegalStateException( "Method does not have a type - " + this );
}

private Method resolveJavaMember() {
final Class<?> declaringTypeClass = declaringType.toJavaClass();
methods: for ( Method method : declaringTypeClass.getDeclaredMethods() ) {
if ( !method.getName().equals( methodInfo.name() ) ) {
continue;
}

if ( method.getParameterCount() != methodInfo.parametersCount() ) {
continue;
}

for ( int i = 0; i < method.getParameterTypes().length; i++ ) {
final Class<?> methodParameterType = method.getParameterTypes()[i];
final Type expectedType = methodInfo.parameterType( i );
if ( !methodParameterType.getName().equals( expectedType.name().toString() ) ) {
continue methods;
}
}
private Method underlyingMethod;

// if we get here, we've found it
return method;
@Override
public Method toJavaMember() {
if ( underlyingMethod == null ) {
final Class<?> declaringClass = declaringType.toJavaClass();
underlyingMethod = ReflectionHelper.resolveJavaMember(
this,
declaringClass,
getModelContext().getClassLoading(),
getModelContext()
);
}
return underlyingMethod;
}

throw new RuntimeException(
String.format(
"Jandex FieldInfo had no corresponding Field : %s.%s",
declaringType.getName(),
methodInfo.name()
)
); }
@Override
public Method toJavaMember(Class<?> declaringClass, ClassLoading classLoading, SourceModelContext modelContext) {
return ReflectionHelper.resolveJavaMember(
this,
declaringClass,
getModelContext().getClassLoading(),
getModelContext()
);
}

@Override
public ClassDetails getReturnType() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@
import org.hibernate.models.IllegalCastException;
import org.hibernate.models.spi.AnnotationDescriptor;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassLoading;
import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MethodDetails;
import org.hibernate.models.spi.MutableClassDetails;
import org.hibernate.models.spi.MutableMemberDetails;
import org.hibernate.models.spi.RecordComponentDetails;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;
import org.hibernate.models.spi.TypeDetails;

import org.jboss.jandex.AnnotationTarget;
Expand Down Expand Up @@ -89,6 +91,12 @@ public Member toJavaMember() {
return null;
}

@Override
public Member toJavaMember(Class<?> declaringClass, ClassLoading classLoading, SourceModelContext modelContext) {
// we could maybe resolve the corresponding method...
return null;
}

@Override
public String toString() {
return "JandexFieldDetails(" + getName() + ")";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright: Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.models;

import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassLoading;
import org.hibernate.models.spi.SourceModelContext;

/**
* Generally indicates an attempt to resolve a {@linkplain ClassDetails}
* into the corresponding Java {@linkplain Class} when the ClassDetails does not
* specify a {@linkplain ClassDetails#getClassName() class name}.
*
* @see ClassDetails#toJavaClass()
* @see ClassDetails#toJavaClass(ClassLoading, SourceModelContext)
*
* @author Steve Ebersole
*/
public class DynamicClassException extends ModelsException {
public DynamicClassException(String message) {
super( message );
}

public DynamicClassException(String message, Throwable cause) {
super( message, cause );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@
import org.hibernate.models.serial.spi.SerialClassDetails;
import org.hibernate.models.spi.AnnotationDescriptor;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassLoading;
import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MethodDetails;
import org.hibernate.models.spi.RecordComponentDetails;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;
import org.hibernate.models.spi.TypeDetails;
import org.hibernate.models.spi.TypeVariableDetails;

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

@Override
public <X> Class<X> toJavaClass(ClassLoading classLoading, SourceModelContext modelContext) {
return toJavaClass();
}

@Override
public SerialClassDetails toStorableForm() {
return new SerialFormImpl( packageName, packageInfoClassName );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@
import org.hibernate.models.serial.spi.SerialClassDetails;
import org.hibernate.models.spi.AnnotationDescriptor;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassLoading;
import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MethodDetails;
import org.hibernate.models.spi.RecordComponentDetails;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;
import org.hibernate.models.spi.TypeDetails;
import org.hibernate.models.spi.TypeVariableDetails;

Expand Down Expand Up @@ -69,6 +71,11 @@ public <X> Class<X> toJavaClass() {
return (Class<X>) clazz;
}

@Override
public <X> Class<X> toJavaClass(ClassLoading classLoading, SourceModelContext modelContext) {
return classLoading.classForName( clazz.getName() );
}

@Override
public String toString() {
return "ClassDetails(" + clazz.getName() + ")";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,6 @@ public <T> Class<T> findClassForName(String name) {
}
}

@Override
public Package packageForName(String name) {
return getClass().getClassLoader().getDefinedPackage( name );
}

@Override
public URL locateResource(String resourceName) {
return getClass().getClassLoader().getResource( resourceName );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,17 @@
import java.util.Collections;
import java.util.List;

import org.hibernate.models.DynamicClassException;
import org.hibernate.models.internal.ClassDetailsSupport;
import org.hibernate.models.internal.ClassTypeDetailsImpl;
import org.hibernate.models.serial.spi.SerialClassDetails;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassLoading;
import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MethodDetails;
import org.hibernate.models.spi.RecordComponentDetails;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.SourceModelContext;
import org.hibernate.models.spi.TypeDetails;
import org.hibernate.models.spi.TypeVariableDetails;

Expand Down Expand Up @@ -221,10 +224,16 @@ public DynamicFieldDetails applyAttribute(

@Override
public <X> Class<X> toJavaClass() {
return toJavaClass( getModelContext().getClassLoading(), getModelContext() );
}

@Override
public <X> Class<X> toJavaClass(ClassLoading classLoading, SourceModelContext modelContext) {
if ( javaType == null ) {
if ( className != null ) {
javaType = getModelContext().getClassLoading().classForName( className );
if ( className == null ) {
throw new DynamicClassException( "ClassDetails (name=" + name + ") did not specify a class-name" );
}
javaType = getModelContext().getClassLoading().classForName( className );
}
//noinspection unchecked
return (Class<X>) javaType;
Expand Down
Loading
Loading