All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.models.internal.jandex.JandexFieldDetails Maven / Gradle / Ivy

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * SPDX-License-Identifier: Apache-2.0
 * Copyright: Red Hat Inc. and Hibernate Authors
 */
package org.hibernate.models.internal.jandex;

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

import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MutableMemberDetails;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.models.spi.TypeDetails;

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

import static org.hibernate.models.internal.jandex.JandexTypeSwitchStandard.switchType;

/**
 * @author Steve Ebersole
 */
public class JandexFieldDetails extends AbstractAnnotationTarget implements FieldDetails, MutableMemberDetails {
	private final FieldInfo fieldInfo;
	private final TypeDetails type;
	private final ClassDetails declaringType;

	private final boolean isArray;
	private final boolean isPlural;

	public JandexFieldDetails(
			FieldInfo fieldInfo,
			ClassDetails declaringType,
			SourceModelBuildingContext buildingContext) {
		super( buildingContext );
		this.fieldInfo = fieldInfo;
		this.declaringType = declaringType;
		this.type = switchType( fieldInfo.type(), declaringType, buildingContext );

		this.isArray = fieldInfo.type().kind() == Type.Kind.ARRAY;
		this.isPlural = isArray || type.isImplementor( Collection.class ) || type.isImplementor( Map.class );
	}

	@Override
	protected AnnotationTarget getJandexAnnotationTarget() {
		return fieldInfo;
	}

	@Override
	public String getName() {
		return fieldInfo.name();
	}

	@Override
	public TypeDetails getType() {
		return type;
	}

	@Override
	public ClassDetails getDeclaringType() {
		return declaringType;
	}

	@Override
	public boolean isPlural() {
		return isPlural;
	}

	@Override
	public boolean isArray() {
		return isArray;
	}

	@Override
	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() + ")";
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy