package org.yajul.micro; import com.google.inject.AbstractModule; import java.net.URL; import java.util.Enumeration; import java.io.IOException; import java.io.InputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.yajul.util.ReflectionUtil; /** * Module that loads bindings and other modules from a resource. * <br> * User: josh * Date: Nov 10, 2009 * Time: 11:58:55 AM */ public abstract class AbstractResourceModule extends AbstractModule { private static final Logger log = LoggerFactory.getLogger(AbstractResourceModule.class); private String resourceName; private ClassLoader classLoader; public AbstractResourceModule(String resourceName, ClassLoader classLoader) { this.classLoader = classLoader; this.resourceName = resourceName; } public AbstractResourceModule(String resourceName) { this(resourceName, ReflectionUtil.getCurrentClassLoader()); } public String getResourceName() { return resourceName; } public ClassLoader getClassLoader() { return classLoader; } @SuppressWarnings({"ConstantConditions"}) protected final void configure() { // Look for the resource in the class loader. Load each properties file and register all // of the components. Enumeration<URL> resources; try { resources = getClassLoader().getResources(getResourceName()); } catch (IOException e) { binder().addError(e.getMessage(),e); return; } int resourceCount = 0; while (resources.hasMoreElements()) { URL url = resources.nextElement(); log.debug(url + " ..."); try { InputStream stream = url.openStream(); configureFromResource(stream, url); resourceCount++; } catch (Exception e) { final String msg = "Error configuring from " + url + ": " + e.getMessage(); log.error(msg,e); binder().addError(msg,e); } } log.info("Added components from " + resourceCount + " resources."); } protected abstract void configureFromResource(InputStream stream, URL url) throws Exception; }