@Override
public final Module installModule(ClassLoader classLoader, Resource resource, Dictionary<String, String> headers, Attachable context) throws ModuleException {
assertNoShutdown();
context = context != null ? context : new AttachableSupport();
AbstractModule module = createModule(classLoader, resource, headers, context);
ModuleEntriesProvider entriesProvider = context.getAttachment(AbstractModule.MODULE_ENTRIES_PROVIDER_KEY);
entriesProvider = entriesProvider != null ? entriesProvider : getDefaultEntriesProvider(module, context);
if (entriesProvider != null) {
module.putAttachment(AbstractModule.MODULE_ENTRIES_PROVIDER_KEY, entriesProvider);
}
if (getModule(module.getIdentity()) != null)
throw new ModuleException("Module already installed: " + module);
modules.put(module.getModuleId(), module);
module.setState(State.INSTALLED);
runtimeEvents.fireModuleEvent(module, ModuleEvent.INSTALLED);
LOGGER.info("Installed: {}", module);
return module;
}