package org.yajul.micro; import org.yajul.xml.DOMUtil; import org.yajul.util.ReflectionUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.InputStream; import java.util.List; import java.net.URL; import com.google.inject.Module; /** * Loads Guice modules listed in XML files. * <br> * User: josh * Date: Nov 10, 2009 * Time: 12:05:10 PM */ public class XmlResourceModule extends AbstractResourceModule { private static final Logger log = LoggerFactory.getLogger(XmlResourceModule.class); private static final String ROOT_ELEMENT_NAME = "modules"; public XmlResourceModule(String resourceName, ClassLoader classLoader) { super(resourceName, classLoader); } public XmlResourceModule(String resourceName) { super(resourceName); } protected void configureFromResource(InputStream stream, URL url) throws Exception { // Parse the XML resource. Document doc = DOMUtil.parse(stream); // The parent element is <modules> if (!ROOT_ELEMENT_NAME.equals(doc.getDocumentElement().getTagName())) throw new Exception("Expected <" + ROOT_ELEMENT_NAME + ">, found " + doc.getDocumentElement().getTagName() + " in " + url); // Add each Guice module class name. List<Element> moduleElements = DOMUtil.getChildElements(doc); for (Element moduleElement : moduleElements) { String moduleClassName = DOMUtil.getChildText(moduleElement); Module module = ReflectionUtil.createInstance(moduleClassName,getClassLoader(),Module.class); log.info("Configuring with " + module + " from " + url); binder().install(module); } } }