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

com.xlrit.gears.engine.util.ReflectUtils Maven / Gradle / Ivy

package com.xlrit.gears.engine.util;

import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;

import com.xlrit.gears.engine.meta.Property;

public class ReflectUtils {
	public static Property getIdProperty(Class clazz) {
		Predicate predicate = elem ->
			elem.isAnnotationPresent(com.xlrit.gears.base.meta.Id.class) ||
			elem.isAnnotationPresent(jakarta.persistence.Id.class);

		return findProperty(clazz, predicate)
			.orElseThrow(() -> new RuntimeException(clazz + " has no property annotated with @Id"));
	}

	public static Property getDisplayedProperty(Class clazz) {
		Predicate predicate = elem ->
			elem.isAnnotationPresent(com.xlrit.gears.base.meta.Displayed.class);

		return findProperty(clazz, predicate)
			.orElseGet(() -> Property.fromToString(clazz));
	}

	public static Optional findProperty(Class clazz, Predicate predicate) {
		// first search by getter
		Stream fromGetter = streamDeclaredMethods(clazz)
			.filter(predicate)
			.map(getter -> Property.fromMethod(clazz, getter));

		// then by field
		Stream fromField = streamDeclaredFields(clazz)
			.filter(predicate)
			.map(field -> Property.fromField(clazz, field));

		return Stream.concat(fromGetter, fromField).findFirst();
	}

	public static Stream streamDeclaredMethods(Class clazz) {
		return Arrays.stream(clazz.getDeclaredMethods());
	}

	public static Stream streamDeclaredFields(Class clazz) {
		return Arrays.stream(clazz.getDeclaredFields());
	}

	public static boolean isGetter(Method m, String cname) {
		return (m.getName().equals("get" + cname) || m.getName().equals("is" + cname))
			&& (m.getParameterCount() == 0);
	}

	public static boolean isSetter(Method m, String cname) {
		return m.getName().equals("set" + cname) && (m.getParameterCount() == 1);
	}

	public static boolean isBidiSetter(Method m, String cname) {
		return m.getName().equals("set" + cname + "Bidi") && (m.getParameterCount() == 1);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy