package com.sf.ddao.chain;
import com.google.inject.AbstractModule;
import java.lang.annotation.Annotation;
import java.util.Arrays;
import java.util.Set;
/**
* Created by psyrtsov
*/
public class ChainModule extends AbstractModule {
private final Class<?>[] chainClassList;
public ChainModule(Class<?>... chainClassList) {
this.chainClassList = chainClassList;
}
protected void configure() {
final Set<Class<?>> classes;
try {
classes = PackageScanner.getClasses(chainClassList);
} catch (Exception e) {
throw new RuntimeException(e);
}
classes.addAll(Arrays.asList(chainClassList));
for (Class<?> aClass : classes) {
if (!aClass.isInterface()) {
continue;
}
final Annotation[] annotations = aClass.getAnnotations();
for (Annotation annotation : annotations) {
if (annotation.annotationType().isAnnotationPresent(CommandAnnotation.class)) {
bindChain(aClass);
break;
}
}
}
}
protected void bindChain(Class<?> aClass) {
//noinspection unchecked
bind(aClass).toProvider(new ChainHandlerProvider(getProvider(ChainInvocationHandler.class), aClass));
}
}