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

ro.fortsoft.genericdata.utils.hibernate.ReflectionUtil Maven / Gradle / Ivy

package ro.fortsoft.genericdata.utils.hibernate;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import org.apache.commons.lang3.StringUtils;

public class ReflectionUtil {

	public static Field[] getEntityFields(final Class clazz) {
		final Field[] fields = clazz.getDeclaredFields();
		for (final Field field : fields) {
			if (!Modifier.isPublic(field.getModifiers())) {
				field.setAccessible(true);
			}
		}
		return fields;
	}

	public static List getEntityLazyFields(final Class clazz) {
		final Field[] fields = clazz.getDeclaredFields();
		final List retList = new ArrayList();
		for (final Field field : fields) {
			if (!Modifier.isPublic(field.getModifiers())) {
				field.setAccessible(true);
			}
			if (field.isAnnotationPresent(OneToMany.class) && FetchType.LAZY
					.equals(field.getAnnotation(OneToMany.class).fetch())
					|| field.isAnnotationPresent(ManyToOne.class) && FetchType.LAZY
					.equals(field.getAnnotation(ManyToOne.class)
							.fetch())
					|| field.isAnnotationPresent(ManyToMany.class) && FetchType.LAZY
					.equals(field.getAnnotation(ManyToMany.class)
							.fetch())
					|| field.isAnnotationPresent(OneToOne.class) && FetchType.LAZY
					.equals(field.getAnnotation(OneToOne.class).fetch())) {
				retList.add(field);
			}
		}
		return retList;
	}

	public static Field getLazyField(final Class clazz,
			final String fieldName) {
		final List lazyFields = getEntityLazyFields(clazz);
		for (final Field field : lazyFields) {
			if (field.getName().equals(fieldName)) {
				return field;
			}
		}
		return null;
	}

	private static Field getEntityIdField(final Class clazz) {

		final Field[] fields = clazz.getDeclaredFields();
		for (final Field field : fields) {
			if (!Modifier.isPublic(field.getModifiers())) {
				field.setAccessible(true);
			}
			if (field.getAnnotation(Id.class) != null) {
				return field;
			}
		}
		return null;
	}

	public static final String getEntityIdFieldName(final Class clazz) {
		final Field field = getEntityIdField(clazz);
		if (field != null) {
			return field.getName();
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public static final  K getEntityIdFieldValue(
			final Class clazz, final V obj) {
		final Field field = getEntityIdField(clazz);
		if (field != null) {
			try {
				return (K) field.get(obj);
			} catch (final IllegalArgumentException e) {
				e.printStackTrace();
			} catch (final IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public static  T getObjectProperty(
			final Object obj, final String propName) {

		Class targetClass = obj.getClass();
		// Keep backing up the inheritance hierarchy.
		do {
			final Field[] fields = targetClass.getDeclaredFields();
			for (final Field field : fields) {
				if (!Modifier.isPublic(field.getModifiers())) {
					field.setAccessible(true);
				}
				if (field.getName().equals(propName)) {
					try {
						return (T) field.get(obj);
					} catch (final IllegalArgumentException e) {
						e.printStackTrace();
					} catch (final IllegalAccessException e) {
						e.printStackTrace();
					}
				}
			}
			targetClass = targetClass.getSuperclass();
		} while (targetClass != null && targetClass != Object.class);

		return null;
	}

	public static  T setObjectProperty(final T obj, final Object value,
			final String propName) {

		Class targetClass = obj.getClass();
		// Keep backing up the inheritance hierarchy.
		do {
			final Method[] methods = targetClass.getDeclaredMethods();
			for (final Method method : methods) {
				if (Modifier.isPublic(method.getModifiers())) {
					final String name = "set" + StringUtils.capitalize(propName);
					if (method.getName().equals(name)) {
						try {
							// System.err.println("name=" + name + ",value="
							// + value);
							method.invoke(obj, value);
							break;
						} catch (final Exception e) {
							e.printStackTrace();
						}
					}
				}

			}
			targetClass = targetClass.getSuperclass();
		} while (targetClass != null && targetClass != Object.class);

		return obj;
	}

	public static  T setObjectProperties(final T obj, final Object[] values,
			final List props) {

		Class targetClass = obj.getClass();
		// Keep backing up the inheritance hierarchy.
		do {

			for (int i = 0; i < props.size(); i++) {
				final String propName = props.get(i);
				final String name = "set" + StringUtils.capitalize(propName);
				final Object val = values[i];
				final Field[] fields = targetClass.getDeclaredFields();
				for (final Field field : fields) {
					if (!Modifier.isPublic(field.getModifiers())) {
						field.setAccessible(true);
					}
					if (field.getName().equals(propName)) {
						try {
							final Method method = targetClass.getDeclaredMethod(name,
									field.getType());
							method.invoke(obj, val);
						} catch (final Exception e) {
							e.printStackTrace();
						}
						break;
					}
				}
			}
			targetClass = targetClass.getSuperclass();
		} while (targetClass != null && targetClass != Object.class);

		return obj;
	}

	@SuppressWarnings("unchecked")
	public static  List getTransformedList(
			final Collection source, final String field) {
		final List retval = new ArrayList();
		final Iterator iterator = source.iterator();
		while (iterator.hasNext()) {
			final K k = iterator.next();
			final Serializable j = getObjectProperty(k, field);
			retval.add((J) j);
		}
		return retval;
	}


	public static Object invokeMethod(final Method method, final Object target) {
		return invokeMethod(method, target, new Object[0]);
	}

	public static Object invokeMethod(final Method method, final Object target,
			final Object[] args) {
		try {
			return method.invoke(target, args);
		} catch (final Exception ex) {
			ex.printStackTrace();
			throw new IllegalStateException("Should never get here");
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy