WrappedFieldData.java

package hu.ddsi.java.database;

import java.lang.reflect.Field;
import java.util.Arrays;

import eu.javaexperience.interfaces.ObjectWithProperty;
import eu.javaexperience.interfaces.ObjectWithPropertyStorage;
import eu.javaexperience.interfaces.simple.getBy.GetBy1;

public class WrappedFieldData implements ObjectWithProperty
{
	Field field;
	
	public WrappedFieldData(Field field)
	{
		this.field = field;
	}

	@Override
	public Object get(String key)
	{
		return PROPS.get(this, key);
	}

	@Override
	public String[] keys()
	{
		return PROPS.keys();
	}
	
	protected static ObjectWithPropertyStorage<WrappedFieldData> PROPS = new ObjectWithPropertyStorage<>();
	
	static
	{
		PROPS.addExaminer("name", (f)->f.field.getName());
		PROPS.addExaminer("declaringClass", (f)->f.field.getDeclaringClass().getName());
		PROPS.addExaminer("type", (f)->f.field.getType().getName());
		PROPS.addExaminer("modifiers", (f)->f.field.getModifiers());
		PROPS.addExaminer("annotations", (f)->WrappedAnnotation.wrap(f.field.getAnnotations()));
	}
	
	public static WrappedFieldData wrap(Field field)
	{
		return new WrappedFieldData(field);
	}

	public static WrappedFieldData[] wrapAll(Field[] fields, GetBy1<Boolean, Field> fieldSelector)
	{
		WrappedFieldData[] ret = new WrappedFieldData[fields.length];
		int l = 0;
		for(int i = 0;i<ret.length;++i)
		{
			if(Boolean.TRUE == fieldSelector.getBy(fields[i]))
			{
				ret[l++] = wrap(fields[i]);
			}
		}
		
		if(l != ret.length)
		{
			ret = Arrays.copyOf(ret, l);
		}
		
		return ret;
	}
}