package org.jspringbot.spring; import org.jspringbot.MainContextHolder; import org.jspringbot.Visitor; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.util.ReflectionUtils; import java.lang.reflect.Field; import java.util.LinkedHashMap; import java.util.Map; public class SpringRobotLibraryManagerImpl implements SpringRobotLibraryManager { private Map<RobotScope, ClassPathXmlApplicationContext> libraries = new LinkedHashMap<RobotScope, ClassPathXmlApplicationContext>(); @Override public void addLibrary(Class libraryClass, ClassPathXmlApplicationContext context) throws Exception { Field field = ReflectionUtils.findField(libraryClass, "ROBOT_LIBRARY_SCOPE"); RobotScope scope = RobotScope.toRobotScope((String) field.get(libraryClass)); ClassPathXmlApplicationContext current = libraries.get(scope); if(current != null && current.isActive()) { current.destroy(); } else { libraries.put(scope, context); } } public void destroy() { visitActive(RobotScope.ALL, new Visitor<ClassPathXmlApplicationContext>() { @Override public void visit(ClassPathXmlApplicationContext context) { context.destroy(); } }); } @Override public void visitActive(RobotScope scope, Visitor<ClassPathXmlApplicationContext> visitor) { // visit the parent visitor.visit(MainContextHolder.get()); if(RobotScope.ALL.equals(scope)) { for(ClassPathXmlApplicationContext context : libraries.values()) { if(context.isActive() && context.isRunning()) { visitor.visit(context); } } return; } ClassPathXmlApplicationContext context = libraries.get(scope); if(context != null && context.isActive() && context.isRunning()) { visitor.visit(context); } } }