package adapters;
/**
* @author Hao ZHANG
*/
import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
public class AdapterTackle {
protected Map<Class<?>, Class<?>> adapters = new HashMap<>();
public AdapterTackle(Package pkg){
addFromPkg(adapters, pkg);
}
private void addFromPkg(Map<Class<?>, Class<?>> adps, Package pkg){
Annotation[] aps = pkg.getAnnotations();
for (Annotation ap: aps){
if (ap instanceof XmlJavaTypeAdapters){
XmlJavaTypeAdapters app = (XmlJavaTypeAdapters)ap;
XmlJavaTypeAdapter[] ans = app.value();
for (Annotation a: ans){
if (a instanceof XmlJavaTypeAdapter){
XmlJavaTypeAdapter ann = (XmlJavaTypeAdapter)a;
Class<? extends XmlAdapter> cAdapter = ann.value();
Type[] types = ((ParameterizedType)(cAdapter.getGenericSuperclass())).getActualTypeArguments();
Class c = null;
Class i = null;
try {
String typeAndName0 = types[0].toString();
String typeAndName1 = types[1].toString();
c = Class.forName(typeAndName0.split(" ")[1]);
i = Class.forName(typeAndName1.split(" ")[1]);
if (!adps.containsKey(i)){
adps.put(i, c);
}
} catch (ClassNotFoundException e){
e.printStackTrace();
}
}
}
}
}
}
public Class<?> getClassByInterface(Class<?> intface){
return adapters.get(intface);
}
}