package net.csdn.bootstrap.loader.impl;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
import javassist.ClassPool;
import javassist.CtClass;
import net.csdn.ServiceFramwork;
import net.csdn.annotation.AnnotationException;
import net.csdn.annotation.Service;
import net.csdn.bootstrap.loader.Loader;
import net.csdn.common.settings.Settings;
import net.csdn.modules.scan.ScanService;
import java.io.DataInputStream;
import java.util.ArrayList;
import java.util.List;
import static net.csdn.common.logging.support.MessageFormat.format;
/**
* BlogInfo: WilliamZhu
* Date: 12-7-2
* Time: 上午11:32
*/
public class ServiceLoader implements Loader {
@Override
public void load(Settings settings) throws Exception {
final List<Module> moduleList = new ArrayList<Module>();
ServiceFramwork.scanService.scanArchives(settings.get("application.service"), new ScanService.LoadClassEnhanceCallBack() {
@Override
public Class loaded(ClassPool classPool, DataInputStream classFile) {
try {
CtClass ctClass = classPool.makeClass(classFile);
if (!ctClass.hasAnnotation(Service.class)) {
return null;
}
final Class clzz = ctClass.toClass();
final Service service = (Service) clzz.getAnnotation(Service.class);
if (clzz.isInterface() && service.implementedBy() == null)
throw new AnnotationException(format("{} no implemented class configured", clzz.getName()));
moduleList.add(new AbstractModule() {
@Override
protected void configure() {
if (clzz.isInterface()) {
bind(clzz).to(service.implementedBy()).in(service.value());
} else {
bind(clzz).in(service.value());
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
});
ServiceFramwork.injector = ServiceFramwork.injector.createChildInjector(moduleList);
}
}