package com.ctp.cdi.query.meta.extractor;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import org.jboss.solder.logging.Logger;
import com.ctp.cdi.query.meta.DaoEntity;
import com.ctp.cdi.query.util.EntityUtils;
public class TypeMetadataExtractor implements MetadataExtractor {
private final Logger log = Logger.getLogger(getClass());
@Override
public DaoEntity extract(Class<?> daoClass) {
for (Type inf : daoClass.getGenericInterfaces()) {
DaoEntity result = extractFrom(inf);
if (result != null) {
return result;
}
}
DaoEntity result = extractFrom(daoClass.getGenericSuperclass());
if (result != null) {
return result;
}
for (Type intf : daoClass.getGenericInterfaces()) {
result = extractFrom(intf);
if (result != null) {
return result;
}
}
if (daoClass.getSuperclass() != null) {
return extract(daoClass.getSuperclass());
}
return null;
}
@SuppressWarnings("unchecked")
private DaoEntity extractFrom(Type type) {
log.debugv("extractFrom: type = {0}", type);
if (!(type instanceof ParameterizedType)) {
return null;
}
ParameterizedType parametrizedType = (ParameterizedType) type;
Type[] genericTypes = parametrizedType.getActualTypeArguments();
DaoEntity result = null;
for (Type genericType : genericTypes) {
if (genericType instanceof Class && EntityUtils.isEntityClass((Class<?>) genericType)) {
result = new DaoEntity((Class<?>) genericType);
continue;
}
if (result != null && genericType instanceof Class) {
result.setPrimaryClass((Class<? extends Serializable>) genericType);
return result;
}
}
return result;
}
}