Skip to content

Commit

Permalink
#19 - Add MemberDetails#toJavaMember
Browse files Browse the repository at this point in the history
  • Loading branch information
sebersole committed Jan 22, 2024
1 parent d37c032 commit f857a91
Show file tree
Hide file tree
Showing 12 changed files with 138 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
*/
package org.hibernate.models.internal.dynamic;

import java.lang.reflect.Member;

import org.hibernate.models.internal.MutableMemberDetails;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.FieldDetails;
Expand Down Expand Up @@ -53,6 +55,11 @@ public int getModifiers() {
return modifierFlags;
}

@Override
public Member toJavaMember() {
return null;
}

@Override
public String toString() {
return "DynamicFieldDetails(" + name + ")";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package org.hibernate.models.internal.dynamic;

import java.lang.reflect.Member;
import java.util.List;

import org.hibernate.models.internal.ModifierUtils;
Expand Down Expand Up @@ -71,6 +72,11 @@ public int getModifiers() {
return modifierFlags;
}

@Override
public Member toJavaMember() {
return null;
}

@Override
public ClassDetails getReturnType() {
return returnType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
*/
package org.hibernate.models.internal.dynamic;

import java.lang.reflect.Member;

import org.hibernate.models.internal.MutableMemberDetails;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.FieldDetails;
Expand Down Expand Up @@ -60,6 +62,11 @@ public boolean isPersistable() {
return true;
}

@Override
public Member toJavaMember() {
return null;
}

@Override
public String toString() {
return "MapModeFieldDetails(" + name + ")";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
*/
package org.hibernate.models.internal.jandex;

import java.lang.reflect.Field;
import java.lang.reflect.Member;

import org.hibernate.models.internal.MutableMemberDetails;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.FieldDetails;
Expand Down Expand Up @@ -57,6 +60,33 @@ public int getModifiers() {
return fieldInfo.flags();
}

private Member underlyingMember;

@Override
public Member toJavaMember() {
if ( underlyingMember == null ) {
underlyingMember = resolveJavaMember();
}
return underlyingMember;
}

private Field resolveJavaMember() {
final Class<?> declaringJavaClass = declaringType.toJavaClass();
try {
return declaringJavaClass.getField( fieldInfo.name() );
}
catch (NoSuchFieldException e) {
throw new RuntimeException(
String.format(
"Jandex FieldInfo had no corresponding Field : %s.%s",
declaringType.getName(),
fieldInfo.name()
),
e
);
}
}

@Override
public String toString() {
return "JandexFieldDetails(" + getName() + ")";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package org.hibernate.models.internal.jandex;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
Expand All @@ -18,6 +19,7 @@

import org.jboss.jandex.AnnotationTarget;
import org.jboss.jandex.MethodInfo;
import org.jboss.jandex.Type;

/**
* @author Steve Ebersole
Expand Down Expand Up @@ -82,6 +84,47 @@ public int getModifiers() {
return methodInfo.flags();
}

private Method underlyingMethod;

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

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;
}
}

// if we get here, we've found it
return method;
}

throw new RuntimeException(
String.format(
"Jandex FieldInfo had no corresponding Field : %s.%s",
declaringType.getName(),
methodInfo.name()
)
); }

@Override
public ClassDetails getReturnType() {
return returnType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
*/
package org.hibernate.models.internal.jandex;

import java.lang.reflect.Member;

import org.hibernate.models.internal.MutableMemberDetails;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.RecordComponentDetails;
Expand Down Expand Up @@ -57,6 +59,12 @@ public int getModifiers() {
return recordComponentInfo.accessor().flags();
}

@Override
public Member toJavaMember() {
// 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
Expand Up @@ -7,6 +7,7 @@
package org.hibernate.models.internal.jdk;

import java.lang.reflect.Field;
import java.lang.reflect.Member;

import org.hibernate.models.internal.MutableMemberDetails;
import org.hibernate.models.spi.ClassDetails;
Expand Down Expand Up @@ -47,6 +48,11 @@ public ClassDetails getDeclaringType() {
return declaringType;
}

@Override
public Field toJavaMember() {
return field;
}

@Override
public int getModifiers() {
return field.getModifiers();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package org.hibernate.models.internal.jdk;

import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -75,6 +76,11 @@ public ClassDetails getDeclaringType() {
return declaringType;
}

@Override
public Method toJavaMember() {
return method;
}

@Override
public int getModifiers() {
return method.getModifiers();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

package org.hibernate.models.internal.jdk;

import java.lang.reflect.Member;
import java.lang.reflect.RecordComponent;

import org.hibernate.models.internal.MutableMemberDetails;
Expand Down Expand Up @@ -50,6 +51,12 @@ public ClassDetails getDeclaringType() {
return declaringType;
}

@Override
public Member toJavaMember() {
// we could maybe resolve the corresponding method...
return null;
}

@Override
public int getModifiers() {
return recordComponent.getAccessor().getModifiers();
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/org/hibernate/models/spi/MemberDetails.java
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,15 @@ default boolean isField() {
*/
String resolveAttributeName();

/**
* Access to the underlying {@linkplain Member}. May return {@code null}. May throw an exception.
*
* @return The underlying member, or {@code null} if there is no underlying member.
*
* @throws RuntimeException If there is expected to be a member, but it cannot be located.
*/
Member toJavaMember();

enum Visibility {
PUBLIC,
PROTECTED,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
*/
package org.hibernate.models.members;

import java.lang.reflect.Field;

import org.hibernate.models.SourceModelTestHelper;
import org.hibernate.models.internal.SourceModelBuildingContextImpl;
import org.hibernate.models.internal.jdk.JdkClassDetails;
Expand Down Expand Up @@ -49,6 +51,8 @@ void verify(Index index) {
assertThat( classDetails.getFields() ).hasSize( 10 );

final FieldDetails propertyField = classDetails.findFieldByName( "property" );
assertThat( propertyField.toJavaMember() ).isInstanceOf( Field.class );
assertThat( propertyField.toJavaMember().getName() ).isEqualTo( "property" );
assertThat( propertyField.resolveAttributeName() ).isEqualTo( "property" );
assertThat( propertyField.getType().toJavaClass() ).isEqualTo( Integer.class );
assertThat( propertyField.getVisibility() ).isEqualTo( MemberDetails.Visibility.PUBLIC );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
*/
package org.hibernate.models.members;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.hibernate.models.SourceModelTestHelper;
import org.hibernate.models.internal.SourceModelBuildingContextImpl;
import org.hibernate.models.internal.jdk.JdkMethodDetails;
Expand Down Expand Up @@ -54,6 +57,8 @@ void verify(Index index) {

if ( method.getName().equals( "getProperty" ) ) {
assertThat( method.getMethodKind() ).isEqualTo( MethodDetails.MethodKind.GETTER );
assertThat( method.toJavaMember() ).isInstanceOf( Method.class );
assertThat( method.toJavaMember().getName() ).isEqualTo( "getProperty" );
assertThat( method.getType() ).isSameAs( method.getReturnType() );
assertThat( method.getArgumentTypes() ).isEmpty();
assertThat( method.resolveAttributeName() ).isEqualTo( "property" );
Expand Down

0 comments on commit f857a91

Please sign in to comment.