package org.simpleflatmapper.reflect.impl;
import org.simpleflatmapper.reflect.InstantiatorDefinition;
import org.simpleflatmapper.reflect.Parameter;
import org.simpleflatmapper.reflect.Getter;
import org.simpleflatmapper.util.TypeHelper;
import java.util.HashMap;
import java.util.Map;
public final class ArgumentBuilder<S> {
@SuppressWarnings("rawtypes")
private static final Getter NULL_GETTER = new Getter() {
@Override
public Object get(Object target) throws Exception {
return null;
}
};
@SuppressWarnings({ "rawtypes" })
private static final Map<Class<?>, Getter> DEFAULT_GETTERS = new HashMap<Class<?>, Getter>();
static {
DEFAULT_GETTERS.put(boolean.class, new Getter() {
@Override
public Object get(Object target) throws Exception {
return Boolean.TRUE;
}
});
DEFAULT_GETTERS.put(byte.class, new Getter() {
@Override
public Object get(Object target) throws Exception {
return (byte) 0;
}
});
DEFAULT_GETTERS.put(char.class, new Getter() {
@Override
public Object get(Object target) throws Exception {
return (char) 0;
}
});
DEFAULT_GETTERS.put(short.class, new Getter() {
@Override
public Object get(Object target) throws Exception {
return (short) 0;
}
});
DEFAULT_GETTERS.put(int.class, new Getter() {
@Override
public Object get(Object target) throws Exception {
return 0;
}
});
DEFAULT_GETTERS.put(long.class, new Getter() {
@Override
public Object get(Object target) throws Exception {
return (long) 0;
}
});
DEFAULT_GETTERS.put(float.class, new Getter() {
@Override
public Object get(Object target) throws Exception {
return 0.0f;
}
});
DEFAULT_GETTERS.put(double.class, new Getter() {
@Override
public Object get(Object target) throws Exception {
return 0.0d;
}
});
}
private final Getter<? super S, ?>[] getters;
@SuppressWarnings("unchecked")
public ArgumentBuilder(InstantiatorDefinition instantiatorDefinition,
Map<Parameter, Getter<? super S, ?>> injections) {
Parameter[] parameters = instantiatorDefinition.getParameters();
getters = new Getter[parameters.length];
for (int i = 0; i < getters.length; i++) {
Parameter param = parameters[i];
Getter<? super S, ?> getter = injections.get(param);
if (getter == null) {
if (TypeHelper.isPrimitive(param.getType())) {
getter = DEFAULT_GETTERS.get(param.getType());
} else {
getter = NULL_GETTER;
}
}
getters[i] = getter;
}
}
public Object[] build(S source) throws Exception {
Object[] args = new Object[getters.length];
for(int i = 0; i < args.length; i++) {
args[i] = getters[i].get(source);
}
return args;
}
}