package com.github.davidmoten.rx.jdbc;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import com.github.davidmoten.rx.jdbc.Util.Col;
import com.github.davidmoten.rx.jdbc.Util.IndexedCol;
import com.github.davidmoten.rx.jdbc.Util.NamedCol;
import com.github.davidmoten.rx.jdbc.annotations.Column;
import com.github.davidmoten.rx.jdbc.annotations.Index;
class AutoMapCache {
final Map<String, Col> methodCols;
public Class<?> cls;
AutoMapCache(Class<?> cls) {
this.cls = cls;
this.methodCols = getMethodCols(cls);
}
private static Map<String, Col> getMethodCols(Class<?> cls) {
Map<String, Col> methodCols = new HashMap<String, Col>();
for (Method method : cls.getMethods()) {
String name = method.getName();
Column column = method.getAnnotation(Column.class);
if (column != null) {
checkHasNoParameters(method);
// TODO check method has a mappable return type
String col = column.value();
if (col.equals(Column.NOT_SPECIFIED))
col = Util.camelCaseToUnderscore(name);
methodCols.put(name, new NamedCol(col, method.getReturnType()));
} else {
Index index = method.getAnnotation(Index.class);
if (index != null) {
// TODO check method has a mappable return type
checkHasNoParameters(method);
methodCols.put(name, new IndexedCol(index.value(), method.getReturnType()));
}
}
}
return methodCols;
}
private static void checkHasNoParameters(Method method) {
if (method.getParameterTypes().length > 0) {
throw new RuntimeException("mapped interface method cannot have parameters");
}
}
}