org.sfm.reflect.ObjectSetterFactory Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of simpleFlatMapper Show documentation
Show all versions of simpleFlatMapper Show documentation
Java library to map flat record - ResultSet, csv - to java object with minimum configuration and low footprint.
package org.sfm.reflect;
import org.sfm.reflect.asm.AsmFactory;
import org.sfm.reflect.impl.FieldSetter;
import org.sfm.reflect.impl.MethodSetter;
import org.sfm.reflect.impl.NullSetter;
import org.sfm.reflect.primitive.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public final class ObjectSetterFactory {
private final AsmFactory asmFactory;
public ObjectSetterFactory(final AsmFactory asmFactory) {
this.asmFactory = asmFactory;
}
public Setter getSetter(final Class target, final String property) {
// first look for method
final Method method = lookForMethod(target, property);
final Setter setter;
if (method == null) {
setter = getFieldSetter(target, property);
} else {
setter = getMethodSetter(method);
}
return setter;
}
public Setter getMethodSetter(final Method method) {
if (asmFactory != null) {
try {
return asmFactory.createSetter(method);
} catch(Exception e) {
// ignore
}
}
return new MethodSetter(method);
}
public Setter getFieldSetter(final Class> target, final String property) {
// look for field
final Field field = lookForField(target, property);
if (field != null) {
return getFieldSetter(field);
} else {
return null;
}
}
private Setter getFieldSetter(Field field) {
if (asmFactory != null && Modifier.isPublic(field.getModifiers())) {
try {
return asmFactory.createSetter(field);
} catch(Exception e) {
}
}
if (!Modifier.isPublic(field.getModifiers())) {
field.setAccessible(true);
}
return new FieldSetter(field);
}
private Method lookForMethod(final Class> target, final String property) {
if (target == null) return null;
for(Method m : target.getDeclaredMethods()) {
if(SetterHelper.methodModifiersMatches(m.getModifiers())
&& SetterHelper.methodNameMatchesProperty(m.getName(), property)) {
return m;
}
}
if (!Object.class.equals(target)) {
return lookForMethod(target.getSuperclass(), property);
}
return null;
}
private Field lookForField(final Class> target, final String property) {
if (target == null) return null;
for(Field field : target.getDeclaredFields()) {
if(SetterHelper.fieldModifiersMatches(field.getModifiers())
&& SetterHelper.fieldNameMatchesProperty(field.getName(), property)) {
return field;
}
}
if (!Object.class.equals(target)) {
return lookForField(target.getSuperclass(), property);
}
return null;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static BooleanSetter toBooleanSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof BooleanSetter) {
return (BooleanSetter) setter;
} else if (setter instanceof MethodSetter) {
return new BooleanMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new BooleanFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
private static boolean isNullSetter(Setter, ?> setter) {
return setter == null || setter instanceof NullSetter;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static ByteSetter toByteSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof ByteSetter) {
return (ByteSetter) setter;
} else if (setter instanceof MethodSetter) {
return new ByteMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new ByteFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static CharacterSetter toCharacterSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof CharacterSetter) {
return (CharacterSetter) setter;
} else if (setter instanceof MethodSetter) {
return new CharacterMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new CharacterFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static ShortSetter toShortSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof ShortSetter) {
return (ShortSetter) setter;
} else if (setter instanceof MethodSetter) {
return new ShortMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new ShortFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static IntSetter toIntSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof IntSetter) {
return (IntSetter) setter;
} else if (setter instanceof MethodSetter) {
return new IntMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new IntFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static LongSetter toLongSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof LongSetter) {
return (LongSetter) setter;
} else if (setter instanceof MethodSetter) {
return new LongMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new LongFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static FloatSetter toFloatSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof FloatSetter) {
return (FloatSetter) setter;
} else if (setter instanceof MethodSetter) {
return new FloatMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new FloatFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static DoubleSetter toDoubleSetter(final Setter setter) {
if (isNullSetter(setter)) {
return null;
} else if (setter instanceof DoubleSetter) {
return (DoubleSetter) setter;
} else if (setter instanceof MethodSetter) {
return new DoubleMethodSetter(((MethodSetter) setter).getMethod());
} else if (setter instanceof FieldSetter) {
return new DoubleFieldSetter(((FieldSetter) setter).getField());
} else {
throw new IllegalArgumentException("Invalid type " + setter);
}
}
}